2011-04-27 87 views
0

防止整行重複,假設我們已經組織了一個非常簡單的SQL表如下:標準SQL

email_address | phone_number 
    [email protected] | 5555555555 
    [email protected] | 9999999999 
    [email protected] | 7468382678 

在這個例子中,它是完全可以擁有附加到電子郵件地址的多個電話號碼。如果我想防止插入精確重複(防止插入,如果兩個列匹配),有沒有辦法做到這一點使用單個查詢?我想避免顯而易見的,「SELECT count(*)FROM db WHERE email_address='[email protected]'AND phone_number ='5555555555',如果我們找不到記錄)

我使用了一個標準版本的MySQL,因此專有擴展不會在這種情況下工作。(我知道的IF NOT EXISTS和其他MS擴展)

是否有任何形式的多-column條件,我可以設置,以實現此目的?什麼是最有效的方法來做到這一點?

使用兩個查詢只是感覺不對

非常感謝。

+0

你的直覺是正確的:使用2個*查詢*是錯誤的。 http://en.wikipedia.org/wiki/Race_condition – soulmerge 2011-04-27 22:31:55

回答

1

不,沒有我知道的ANSI-SQL語句。試試這個MySQL的語句來代替:

INSERT IGNORE INTO your_table (emai_address, phone_number) VALUES ("[email protected]", 5555555555); 

注意:必須有一個唯一索引跨越兩個你列這個工作:

ALTER TABLE your_table ADD UNIQUE KEY (email_address, phone_number); 
+0

我認爲你所做的最後一條評論可能是關鍵。我試過INSERT IGNORE,並沒有像我預期的那樣行事(即使添加了一個唯一的ID)。你如何建立一個索引'跨兩列'? – user688216 2011-04-27 22:37:07

+0

'ALTER TABLE'語句應該這樣做 – soulmerge 2011-04-27 22:39:30

1

建立以兩列在表的唯一約束,所以插入失敗重複。

2

方式一:

create table contact_info 
(
    email_address varchar(256) not null , 
    phone_number varchar(10) not null , 

    primary key clustered (email_address , phone_number) , 

) 

你不會插入任何確切的重複。乙^)

主動,你應該能夠做這樣的事情:

insert contact_info 
select * 
from (select <email-addr_value> as email , 
       <phone-number_value> as phone 
    ) t1 
where not exists (select * from contact_info t2 
        where t2.email_address = t1.email 
        and t2.phone_number = t2.phone 
       ) 
0

的替代(「老派」)的方式來在接受答案的「ALTER TABLE」語句創建獨特索引如此:

create unique index all_columns_idx on your_table(email_address, phone_number) 
0

也許你可以嘗試DISTINCT如果你只想處理顯示?

喜歡的東西:

SELECT DISTINCT * FROM db