假设我们有一个非常简单的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扩展名)
我可以设置任何类型的多列条件来实现这一目标吗?最有效的方法是什么?
使用两个查询感觉不对。
非常感谢。
答案 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