【问题标题】:Handle Violation of PRIMARY KEY while insert in sql server在 sql server 中插入时处理违反 PRIMARY KEY 的问题
【发布时间】:2015-01-26 22:11:35
【问题描述】:

我创建了一个存储过程 (sp),它通过 select 语句将行插入到表中。

它插入包含在数据库所有表中的所有属性值。

在sp执行期间,其他属性被添加到表中,然后再次执行sp。

程序应该忽略违反主键并添加最近添加的新属性。

当违反主键时,该过程不会插入任何行。

这在sql server中可以吗?

【问题讨论】:

  • 有什么例子吗?更清楚一点?这个问题目前的形式很难理解
  • 您是否正在寻找类似mysql的onduplicate key update之类的查询?
  • 请发布示例查询。
  • 插入主键违规??你的意思是新行应该在第二次插入时为primary key 列具有新值吗?
  • 例如我有两个表名为 Hotel(HotelId, name ,adress) 和 manager(id,name);当我执行该过程时,它会查看 tow 表的属性并插入到名为字典 5 行的表中(每行都有属性名称作为主键)。现在,当我将地址添加到表酒店并将年龄添加到经理时,我希望在执行该程序时添加这两个行。我的程序在所有属性名称中迭代的问题,所以它找到了一个实际存在并且无法添加任何东西的人

标签: sql sql-server sql-server-2012


【解决方案1】:

使用合并

-- MERGE statement with the join conditions specified correctly.
USE tempdb;
GO 
BEGIN TRAN;
MERGE Target AS T
USING Source AS S ON (T.EmployeeID = S.EmployeeID)  WHEN NOT MATCHED BY TARGET AND S.EmployeeName LIKE 'S%' 
THEN INSERT(EmployeeID, EmployeeName) VALUES(S.EmployeeID, S.EmployeeName)
WHEN MATCHED 
THEN UPDATE SET T.EmployeeName = S.EmployeeName
WHEN NOT MATCHED BY SOURCE AND T.EmployeeName LIKE 'S%'
THEN DELETE 
OUTPUT $action, inserted.*, deleted.*;
ROLLBACK TRAN;
GO

详情请咨询URL

【讨论】:

  • 好主意,我可以知道实际存在什么并忽略它
【解决方案2】:

无法在主键列中插入相同的 ID。

改为将您的表更改为将标识列作为主键,其余所有内容都可以相同以插入您的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    相关资源
    最近更新 更多