2015-04-22 32 views
1

我想設置一個約束它的表,但是當我插入記錄時,我不想得到任何約束違規錯誤。我希望SQL悄悄地刪除不是唯一的記錄,但繼續插入可以插入的記錄。自動刪除插入記錄,如果他們違反約束

例如....

create table table1 
(value1 int, 
value2 int, 
constraint uc_tab1 Unique (value1,value2) 
) 

create table table2 
(value1 int, 
value2 int 
) 

insert into table2 (value1,value2) 
select 1,1 
union all 
select 2,1 
union all 
select 3,1 
union all 
select 1,1 

insert into table1 
select value1,value2 from table2 

目前,這會跌倒在違反約束。我想,以抑制誤差,使表1中包含...

1,1 

2,1 

3,1 

(在這個例子中,我只是對錶2做一組,但在我的實際應用中,是不是真的可行)

我依稀記得幾年前讀過的東西,但我可能已經想到了。這可能嗎?

提前

回答

0

可以使用IGNORE_DUP_KEYindex option,但我個人認爲這是更好地找到解決你的問題的另一種方式。

您可以將其設置爲ON,以僅針對違反唯一約束而不是生成錯誤的插入行生成警告。

+0

輝煌,這正是我所想的。 – Bakhesh

+0

非常感謝每個人的貢獻 – Bakhesh

+0

@Bakhesh你可以通過檢查我的答案旁邊的複選標記來感謝我:) –

1

請不這樣做,你將失去的數據很容易

而是試圖改變自己的應用程序,它只是插入丟棄不正確的數據

+0

在這種情況下,我們不會,因爲它已經在那裏。我們只需要一個例子。 我可以將插入表加入到原始表中以查找重複項,但我們的表大小很大,我認爲這會很慢 – Bakhesh

0

的有效數據isntead非常感謝查看MERGE聲明。這很複雜,但可以做你正在描述的東西。

(有些東西可能會導致INSERT語句繼續插入數據,即使某些行無法插入,但在我的生活中,我無法在BOL中找到它或記得它被稱爲我敢肯定它引發的錯誤無論如何,這總是聽起來像一個可怕的想法給我。)

0

當我創建我的約束時指定Ignore_Dup_Key的確有竅門。在上述例子中,我改變了表1定義....

創建表table1 (值INT, VALUE2 INT, 約束uc_tab1獨特(值1,值2)WITH(IGNORE_DUP_KEY = ON) )

它的工作完美