Sql 如何在不存在的地方插入?
我希望将insert查询与where not exists组合起来,以避免违反PK约束。但是,下面这样的语法在关键字“WHERE”错误附近给出了不正确的语法- 我怎样才能做到这一点 一般来说,可以将insert与where子句结合使用吗Sql 如何在不存在的地方插入?,sql,sql-server,insert,not-exists,Sql,Sql Server,Insert,Not Exists,我希望将insert查询与where not exists组合起来,以避免违反PK约束。但是,下面这样的语法在关键字“WHERE”错误附近给出了不正确的语法- 我怎样才能做到这一点 一般来说,可以将insert与where子句结合使用吗 INSERT INTO myTable(columns...) Select values... WHERE NOT EXISTS (SELECT * FROM myTable WHERE pk_part1 = value1,
INSERT INTO myTable(columns...)
Select values...
WHERE NOT EXISTS
(SELECT *
FROM myTable
WHERE pk_part1 = value1,
AND pk_part2 = value2)
编辑:
阅读martins link后,如果承认,最好的解决方案是:
BEGIN TRY
INSERT INTO myTable(columns...)
values( values...)
END TRY
BEGIN CATCH
IF ERROR_NUMBER() <> 2627
RAISERROR etc
END CATCH;
保持唯一值列表的最简单方法是a将列设置为主键或b在列上创建唯一约束。当尝试将值插入/更新到表中已经存在的内容时,这两种方法都会导致错误,当notexists/etc将以静默方式失败时,如果没有错误,查询将正确执行 也就是说,使用插入/选择不包括值部分:
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)
mysql具有insert ignore查询: 如果使用IGNORE关键字,则执行INSERT语句时发生的错误将改为警告。例如,在不忽略的情况下,复制表中现有唯一索引或主键值的行将导致重复键错误,语句将中止。使用IGNORE时,仍不会插入行,但不会发出错误。如果未指定IGNORE,将触发错误的数据转换将中止语句。使用“忽略”,将无效值调整为最接近的值并插入;会生成警告,但语句不会中止。您可以使用mysql_info C API函数确定表中实际插入了多少行
关于重复密钥更新也可用没有一个示例适用于我。。。所以我建议这个例子:
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')
是MySQL。我不确定MySQL是否支持这样的子查询。@Nishant-不,不是MySQL,有一个SQL标记。。。我将为Clarity添加SQL Server标记您应该使用存储过程并查看以下链接:@Tim:我添加了mysql错误标记,因为它最初被标记为mysql,并根据与MySQL一致的错误语法错误添加了错误标记。@OMG Ponies-我认为它从未被标记为MySQL-您可以在post History中检查原始版本它生成PK错误。。。我想通过检查确保它在那里来避免这个错误first@froadie:我理解,但我会使用返回的错误来通知用户值已经存在。如果元组存在,则会引发以下错误:values子句必须至少包含一个元素。不允许使用空元素。这仍然会导致尝试在加载时插入重复项。如果OP是在SQL Server 2008上使用Merge,则可以避免此问题。如@Martin所述,我想,我必须重写比此答案或mysql中更多的内容,如果在第一次选择后不从tableName添加,插入myTablecolumns,则无法工作。。。选择值。。。从不存在的myTable
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')