使用索引或触发器来确保唯一性

时间:2013-04-07 01:00:37

标签: mysql sql

我有一个包含3个主键的表(让我们称之为FirstName,SecondName,VersionID)和一个数据列(EmailAddress)。

我想确保在插入数据时,数据列对于前2列中的任何一列都是唯一的。

即,任何EmailAddress对于FirstName,SecondName的任何组合都是唯一的。但是,具有相同FirstName和SecondName但版本ID不同的同一EmailAddress可能有多个值。

我最初的想法是在这些列上创建索引以确保唯一性,但我无法确定如何做到这一点....然后我考虑了触发器,但我不确定如何构造它们

什么是最有效的方式,我将如何进行?

3 个答案:

答案 0 :(得分:0)

# firstname, secondname & emailaddress together must be unique
ALTER TABLE mytable
ADD CONSTRAINT ux_email_firstname_secondname_versionid
UNIQUE (firstname, secondname, emailaddress);

# emailaddress and versionid together must be unique
ALTER TABLE mytable
ADD CONTRAINT ex_emailaddress_versionid
UNIQUE (emailaddress, versionid);

使得三列的组合独特的东西,但如果一个变化,它不再是匹配。

答案 1 :(得分:0)

多个唯一约束:

ALTER TABLE your_table
  ADD CONSTRAINT constraint_name_name UNIQUE (FirstName, SecondName, versionID , EmailAddress)

答案 2 :(得分:0)

我会抛出任何关于你所谈论的触发器的想法。根据您上面的评论,您只需要对电子邮件地址有一个独特的约束。

ALTER TABLE Table_Name
  ADD CONSTRAINT constraint_name UNIQUE (EmailAddress)

我建议不要这样做,因为用户可能输入错误的电子邮件地址,阻止其他用户正确输入其电子邮件地址。

最好的办法是使用@TheEwook编写的查询:

  

多个唯一约束:

     

ALTER TABLE your_table ADD CONSTRAINT constraint_name_name UNIQUE   (FirstName,SecondName,versionID,EmailAddress)共享|编辑

如果您担心有2个用户尝试使用相同的电子邮件地址,那么您可能希望在执行插入操作时通过检查每个用户的最大版本是什么来处理,并将该电子邮件与一个插入。