MySQL使两列UNIQUE

时间:2010-12-25 21:52:34

标签: mysql

不知道这是否可以用于MySQL,因为我知道它不支持检查约束,但我想要的是使两列唯一。在你回答之前

ALTER TABLE <table_name> ADD UNIQUE(<col1>, <col2>);

这不是我想要的。我想确保col1和col2具有唯一值,因此如果它们是INT,则数字“1”在两列之​​间只能存在一次,这意味着如果col1包含“1”,则col2不能包含“1”和“1”可以只在col1中出现一次。希望这是有道理的。

我知道我可以从php级别开始,但是现在有很多代码,如果我错过了一个地方,我不想破坏数据的完整性;我宁愿从数据库中抛出一个错误。我遇到的一些想法是使用触发器。如果有人能给我一个使用触发器来完成这个的例子,那就太好了。

更新

如果你知道我在做什么可能会有所帮助,那么也许你可以提出一个更好的方法:

我有两个字段,email和new_email。当有人更改其电子邮件地址时,我会将其存储到new_email字段中,直到接受更改为止。由于电子邮件是唯一的,因为它被用作登录,因此我必须确保电子邮件在这两个字段中都是唯一的。

5 个答案:

答案 0 :(得分:2)

<强>解决方案

  1. 使用一列MakeColsUnique
  2. 创建一个表ColumnBoth
  3. ColumnBoth
  4. 上创建主键
  5. Col1Col2到此表格的所有值(如果您有重复项,则会失败)
  6. 在INSERT或UPDATE上的OriginalTable上添加触发器,将Col1和Col2中的值插入新表MakeColsUnique
  7. 如果已插入该值,则插入或更新将失败。

答案 1 :(得分:1)

我认为您应该尝试重新组织数据库。我们现在说你有这个:

Table: users

id   name   email          new_email
102  foo    foo@mail.com   foo2@mail.com
103  bar    bar@mail.com   bar2@mail.com
104  baz    baz@mail.com   NULL

这可以改为:

Table: users

id   name
102  foo
103  bar
104  baz

Table: emails

user_id  is_new  email
102      0       foo@mail.com
102      1       foo2@mail.com
103      0       bar@mail.com
103      1       bar2@mail.com
104      0       baz@mail.com

然后,您可以在列email上的最终表格中添加唯一索引。

答案 2 :(得分:0)

您无法使用键约束强制执行此操作。老实说,这个要求听起来有点奇怪,我认为你最好把col1和col2提取到一个单独的表中,比如cols。

答案 3 :(得分:0)

根据您对问题的更新,数据库约束不是有效选项,因为您希望在两个字段中存储电子邮件一段时间,然后在用户接受后接受它。它看起来更像是需要在应用程序业务逻辑中实现的逻辑而不是数据库

答案 4 :(得分:0)

你解决了问题吗?我也遇到过这个问题,最后我用触发器解决了我的问题,按照你的想法。这是我的sql:

delimiter |

CREATE TRIGGER unique_AB BEFORE INSERT ON test
  FOR EACH ROW
  BEGIN
         DECLARE msg varchar(200);  
     DECLARE flag int;
     set flag = (select count(*) from test where A = new.A or B = new.A or A = new.B or B = new.B);
     IF flag > 0 THEN
        set msg = "column duplicate!!!";  
            SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;  
     END IF;
  END;
|

我的表格如下:

CREATE TABLE `test` (
  `A` varchar(255) DEFAULT NULL,
  `B` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

在触发器中,我首先选择了一个并判断是否已经有一个等于我的新行的值,这对我有用。