我想将插入查询与“不存在的地方”结合起来,以免违反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子句组合使用吗?)
答案 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也可用