根据行是否已存在,有选择地插入行

时间:2013-03-20 14:57:23

标签: sql sql-server

我目前有一个有几千个条目的表。我找到了一种方法来为系统中的所有条目插入新的数据行(参见下面的示例),但不幸的是,我发现有些条目已经存在其中的值。我试图弄清楚如何根据行是否已存在来有选择地运行INSERT INTO函数。

Column 1   Column 2   Column 3 
10         Address    True 
10         City       False
10         State      True
20         Address    True
20         City       True
20         State      True
20         NEW        NEW*

Column 1   Column 2   Column 3
10         Address    True
10         City       False
10         State      True
10         NEW        NEW
20         Address    True
20         City       True
20         State      True
20         NEW        NEW

我用于插入的代码是:

insert into table-name(Column1, Column2, Column3)
  select 
     Column1, 'NEW', 'NEW*' 
  from 
     table-name 
  group by 
     Column1

我假设我需要使用IF/ELSE语句,但我在IF语句中遇到了问题。目前,我正在使用以下代码:

IF Column 2 like 'New' leave NULL
ELSE 
  insert into table-name(Column1, Column2, Column3)
     select 
         Column1, 'NEW', 'NEW*' 
     from table-name 
     group by Column1

我知道IF语句是错误的,但是如果已经填充了现有的行值,那么试图弄清楚该怎么办。

5 个答案:

答案 0 :(得分:0)

您可以使用INSERT IGNORE INTO 或INSERT ... ON DUPLICATE KEY UPDATE语法

http://bogdan.org.ua/2007/10/18/mysql-insert-if-not-exists-syntax.html 和 dev.mysql.com

答案 1 :(得分:0)

我认为你想要的是一个带有“ON DUPLICATE KEY”的“INSERT INTO”。

请参阅: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

答案 2 :(得分:0)

对于SQL Server,使用CTE定义要插入的数据集:

WITH NonDupes (<your fieldlist>)
AS
(SELECT <your fieldlist> FROM <your tables> WHERE <tablea>.<column> NOT IN (SELECT <column> FROM <tableb>))
INSERT INTO
<tableb>
VALUES(SELECT * FROM NonDupes)

答案 3 :(得分:0)

使用SQL Server,您可以执行NOT EXISTS

insert into table-name(Column1, Column2, Column3)
  select 
     Column1, 'NEW', 'NEW*' 
  from 
     table-name 
     WHERE NOT EXISTS (SELECT 1 FROM table-name xref WHERE xref.Column1 = table-name.Column1 AND xref.Column2 = 'NEW')
  group by 
     Column1

答案 4 :(得分:0)

您可以使用Merge语句仅插入不存在的行。作为额外的奖励,如果您需要,可以更新同一语句中的现有行。

http://msdn.microsoft.com/en-us/library/bb510625.aspx