0

表 link_instance_message 有一个 PRIMARY KEY CONSTRAINT 以便您在表中不能有 instance_id、message_id 组合的重复项。如果表中已经存在该 intance_id、message_id 组合,我怎么能不让它完全失败?

INSERT INTO link_instance_message
(instance_id, message_id)
select
ins.instance_id as instance_id, mess.message_id as message_id
from
instance as ins,
license as lic,
message as mess
where
ins.license_id = lic.license_id
and lic.license_key = '<INSERT GUID HERE>'
and mess.message_id = (select MAX(message_id) from message)

例如,假设如果表中不存在任何行,则上面的插入语句将插入 5 行。但是,假设已经存在 1 行,上面的插入语句将尝试再次插入。如何在忽略违反 PRIMARY KEY CONSTRAINT 已存在的 1 行的情况下插入其他 4 行。

4

1 回答 1

1

总的来说,我认为这种模式更好。您可能需要升级事务隔离以防止竞争条件和其他并发问题。

DECLARE @message_id INT;

SELECT @message_id = MAX(message_id) FROM dbo.message;

INSERT dbo.link_instance_message -- always use schema prefix
  (instance_id, message_id)
SELECT i.instance_id, @message_id
FROM dbo.instance AS i
WHERE EXISTS 
(
  SELECT 1 FROM dbo.license 
    WHERE license_id = i.license_id 
    AND license_key = '<INSERT GUID HERE>'
)
AND NOT EXISTS 
(
  SELECT 1 FROM dbo.link_instance_message 
     WHERE instance_id = i.instance_id 
     AND message_id = @message_id
);
于 2013-10-23T17:48:42.310 回答