Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在不存在的地方插入?_Sql_Sql Server_Insert_Not Exists - Fatal编程技术网

Sql 如何在不存在的地方插入?

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查询与where not exists组合起来,以避免违反PK约束。但是,下面这样的语法在关键字“WHERE”错误附近给出了不正确的语法-

我怎样才能做到这一点

一般来说,可以将insert与where子句结合使用吗

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')