2013-10-23 15 views
0

表link_instance_message具有PRIMARY KEY CONSTRAINT,因此您無法在表中爲instance_id,message_id組合創建副本。如果表中已經有intance_id,message_id組合,我怎麼能不完全失敗呢?即使插入的一行碰到PRIMARY KEY約束,我如何繼續插入所有其餘的行?

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) 

例如,假設上面的insert語句會在表中沒有行的情況下插入5行。但是,讓我們假設1行已經存在,上面的插入語句會嘗試再次插入。如何插入其他4行,同時忽略已存在的1行違反PRIMARY KEY CONSTRAINT的情況。

+0

幸運的是,有一個保證,一次只有一個用戶會運行這個語句。 :-) 我會在哪裏放不存在......我試過並摸索了一下。 –

+1

另外,請停止使用舊式連接。這些對我來說都像是交叉連接;更不明確的是,你實際上是否意味着其中的一個人。 –

+0

哦,我不是DBA,所以我不知道這些東西。我知道足夠危險的大聲笑。我將如何改變它不使用舊式聯接? –

回答

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 
); 
+0

幸運的是,有一個保證,一次只有一個用戶會運行這個語句。 :-)我會把這個不存在的地方放在哪裏......我試過了,摸索了一下。 –

+0

爲了安全起見,我刪除了模式前綴和可識別的表格信息,這些信息是公司特定的。 –

+0

它在最後... –

相關問題