SQL Insert-仅在此条件下插入

SQL Insert-仅在此条件下插入,sql,sql-server,database,insert,Sql,Sql Server,Database,Insert,我有表1: ID UserString Date ------------------------- 1 KRBS 4/25/2014 2 WEFG 4/24/2014 和表2: ID UserString + Other user info ---------------------------------- 1 KRBS + . . .. . 我正在执行表1中的insert,但我想设置一个条件,

我有
表1

ID    UserString   Date     
-------------------------
 1    KRBS         4/25/2014    
 2    WEFG         4/24/2014
表2

ID  UserString + Other user info 
----------------------------------
 1  KRBS    +  . . .. . 
我正在执行表1中的insert,但我想设置一个条件,仅当用户在表2中已经可用时才进行insert(如果用户在表2中已经存在,则仅在表1中插入行)

我目前正在做两个单独的SQL检查(一个是如果用户存在,然后插入),但我相信有更好的方法可以在mysql上尝试:

if {{ userId }} in (select UserString from Table2 where UserString = {{ userId }}) then
    insert into Table1 (ID, UserString, Date) values ({{ id }}, {{ userId }}, '{{ date }}')
end if
或者在sql server上执行此操作

if {{ userId }} in (select UserString from Table2 where UserString = {{ userId }})
    insert into Table1 (ID, UserString, Date) values ({{ id }}, {{ userId }}, '{{ date }}')
将{{var}}更改为实际值

在mysql上尝试以下操作:

if {{ userId }} in (select UserString from Table2 where UserString = {{ userId }}) then
    insert into Table1 (ID, UserString, Date) values ({{ id }}, {{ userId }}, '{{ date }}')
end if
或者在sql server上执行此操作

if {{ userId }} in (select UserString from Table2 where UserString = {{ userId }})
    insert into Table1 (ID, UserString, Date) values ({{ id }}, {{ userId }}, '{{ date }}')

将{{var}}更改为实际值

实现此目的的最佳方法是在表上定义一个
外键
。这是最简单和最隐含的方法,可以在上找到一些参考。这意味着您将永远无法a)如果不存在相应的FK,则在此表中插入条目;b)如果存在具有外键的条目,则从基表中删除(在您的情况下,如果用户已经具有设置,则删除该用户)。它看起来像:

ALTER TABLE NameOfTheTable
ADD CONSTRAINT FK_SomeNameForTheKey FOREIGN KEY (nameOfColFromThisTable)
    REFERENCES NameOfTheOtherTable (NameOfTheCOlumnYouAreReferencing);

实现这一点的最佳方法是在表上定义一个
外键
。这是最简单和最隐含的方法,可以在上找到一些参考。这意味着您将永远无法a)如果不存在相应的FK,则在此表中插入条目;b)如果存在具有外键的条目,则从基表中删除(在您的情况下,如果用户已经具有设置,则删除该用户)。它看起来像:

ALTER TABLE NameOfTheTable
ADD CONSTRAINT FK_SomeNameForTheKey FOREIGN KEY (nameOfColFromThisTable)
    REFERENCES NameOfTheOtherTable (NameOfTheCOlumnYouAreReferencing);

您可能需要使用
insert。。。选择…
以实现此目的,假设您的
ID
列是自动递增的:

insert into
    table1 (
        UserString,
        Date
    )
select
    table2.UserString,
    @yourDateVariableHere
from
    table2
where
    table2.UserString = @yourUserStringVariableHere

您可能需要使用
insert。。。选择…
以实现此目的,假设您的
ID
列是自动递增的:

insert into
    table1 (
        UserString,
        Date
    )
select
    table2.UserString,
    @yourDateVariableHere
from
    table2
where
    table2.UserString = @yourUserStringVariableHere

这是MySQL还是SQL Server?从您的标记中看不明显…您可以尝试将
插入t1(userstring,date)并从其他表中选择“newuserstring”,“newdate”,其中…
对不起,我删除了SQL ServerMysql@MarcB如果在表1中没有可为空的字段,并且在表2中没有找到任何结果,这不会引发错误吗?@andre:这将是1:1的事情。表2中有5行数据,表1中插入了5行数据。在表2中找到0行,在表1中插入0行。这是MySQL还是SQL Server?从您的标记中看不明显…您可以尝试将
插入t1(userstring,date)并从其他表中选择“newuserstring”,“newdate”,其中…
对不起,我删除了SQL ServerMysql@MarcB如果在表1中没有可为空的字段,并且在表2中没有找到任何结果,这不会引发错误吗?@andre:这将是1:1的事情。表2中有5行数据,表1中插入了5行数据。在表2中找到了0行,在表1中插入了0行。可能他正试图防止错误不必要地显示在他的屏幕或错误日志中。我认为检查仍然有用。但是外键总是一个好的点+1 ;).感谢大家的帮助。我发现这是最好的解决方法:)也许他是在试图防止错误不必要地显示在他的屏幕或错误日志中。我认为检查仍然有用。但是外键总是一个好的点+1 ;).感谢大家的帮助。我发现这是最好的解决方案,干杯:)