使用标准SQL防止整个行重复

时间:2011-04-27 22:25:59

标签: sql

假设我们有一个非常简单的SQL表,如下所示:

  email_address | phone_number
  test@test.com | 5555555555
  test@test.com | 9999999999
  user@user.com | 7468382678

在此示例中,将多个电话号码附加到电子邮件地址即可。如果我想阻止插入完全重复的(如果两个列匹配时阻止插入),有没有办法使用单个查询执行此操作?

(我想避免显而易见的,“SELECT count(*)FROM db WHERE email_address='test@test.com'ENTER_number ='5555555555',如果我们找不到记录,则只有INSERT )

我使用的是MySql的标准版本,因此专有扩展在这种情况下不起作用。 (我知道IF NOT EXISTS和其他MS扩展名)

我可以设置任何类型的多列条件来实现这一目标吗?最有效的方法是什么?

使用两个查询感觉不对。

非常感谢。

5 个答案:

答案 0 :(得分: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
                 )

答案 1 :(得分:1)

不,我没有注意到ANSI-SQL语句。请尝试使用此MySQL语句:

INSERT IGNORE INTO your_table (emai_address, phone_number) VALUES ("test@test.com", 5555555555);

注意:您必须拥有一个跨越两列的唯一索引才能实现此目的:

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

答案 2 :(得分:1)

基于这两列在表上设置唯一约束,因此插入在重复上失败。

答案 3 :(得分:0)

接受答案中“alter table”语句的替代方法(“老派”?)方法是创建一个独特的索引:

create unique index all_columns_idx on your_table(email_address, phone_number)

答案 4 :(得分:0)

如果您只想处理显示器,也许可以尝试DISTINCT?

类似的东西:

SELECT DISTINCT * FROM db