如何在不存在的情况下插入?

时间:2011-01-16 18:04:39

标签: sql sql-server insert not-exists

我想将插入查询与“不存在的地方”结合起来,以免违反PK约束。但是,如下所示的语法会给我Incorrect syntax near the keyword 'WHERE'错误 -

INSERT INTO myTable(columns...)
VALUES(values...)
WHERE NOT EXISTS
   (SELECT *
    FROM myTable
    WHERE pk_part1 = value1,
        AND pk_part2 = value2)

我该如何做到这一点?

(通常,您可以将插入与where子句组合使用吗?)

4 个答案:

答案 0 :(得分:21)

INSERT INTO myTable(columns...)
Select values...
WHERE NOT EXISTS
   (SELECT *
    FROM myTable
    WHERE pk_part1 = value1,
        AND pk_part2 = value2)

修改 阅读完martins链接后,如果承认,最好的解决方案是:

BEGIN TRY
    INSERT INTO myTable(columns...)
    values( values...)
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() <> 2627
      RAISERROR etc
END CATCH;

答案 1 :(得分:3)

保留唯一值列表的最简单方法是:a)将列设置为主键,或b)在列上创建唯一约束。当尝试将值插入/更新到表中已存在的某些内容时,这两种情况都会导致错误,当NOT EXISTS / etc无声地失败时 - 没有错误,查询将正确执行。

也就是说,使用INSERT / SELECT(不包括VALUES部分):

INSERT INTO myTable(columns...)
SELECT [statically defined values...]
  FROM ANY_TABLE
 WHERE NOT EXISTS (SELECT NULL
                     FROM myTable
                    WHERE pk_part1 = value1
                      AND pk_part2 = value2)

答案 2 :(得分:0)

没有一个示例对我有用...所以我建议这个示例:

INSERT INTO database_name.table_name(column_name)
SELECT column_name
  FROM database_name.table_name
 WHERE NOT EXISTS (SELECT NULL
                     FROM database_name.table_name
                    WHERE column_name = 'Column Value')

答案 3 :(得分:-1)

mysql有insert ignore query:

  

如果使用IGNORE关键字,则执行INSERT语句时发生的错误将被视为警告。例如,如果没有IGNORE,则复制表中现有UNIQUE索引或PRIMARY KEY值的行会导致重复键错误,并且语句将中止。使用IGNORE时,仍未插入行,但未发出错误。如果未指定IGNORE,则会触发错误的数据转换会中止语句。使用IGNORE,将无效值调整为最接近的值并插入;产生警告,但声明不会中止。您可以使用mysql_info()C API函数确定实际插入表中的行数。

http://dev.mysql.com/doc/refman/5.0/en/insert.html

ON DUPLICATE KEY UPDATE也可用