20

我想将插入查询与“不存在的地方”结合起来,以免违反 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

4 回答 4

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

编辑: 阅读马丁链接后,如果承认,最好的解决方案是:

BEGIN TRY
    INSERT INTO myTable(columns...)
    values( values...)
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() <> 2627
      RAISERROR etc
END CATCH;
于 2011-01-16T18:07:29.387 回答
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)
于 2011-01-16T18:10:23.337 回答
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')
于 2018-11-01T13:32:44.647 回答
-1

mysql 有插入忽略查询:

如果使用 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 也可用

于 2011-01-16T18:59:39.470 回答