MySQL唯一密钥,仅当另一个密钥包含特定值时



我有一个表,其中包含用户的元数据。共有4个字段。。。

`ID`,`meta_name`,`meta_value`,`user_id`

我想把电子邮件存储在这个表中。当然,这些必须是独一无二的。但是,我也希望将其他数据存储在此表中,其中的数据不需要是唯一的。有没有什么方法可以限制'meta_value'是唯一的,只有当'meta_name'等于"电子邮件"时?

通过MySQL的限制-无

但是,您可以使用insert/update触发器来验证数据的唯一性并禁止非法操作。

这是插入触发器的草稿(您可以在这里玩:http://sqlfiddle.com/#!2/5c9e3):

DELIMITER //
CREATE TRIGGER VerifyInsert BEFORE INSERT ON YourTestTable
FOR EACH ROW
BEGIN
IF (SELECT COUNT(1) FROM YourTestTable
WHERE YourTestTable.meta_name = 'EMail' AND YourTestTable.meta_value = NEW.meta_value
AND NEW.meta_name = YourTestTable.meta_name) > 0 THEN
  SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = 'VerifyInsertFailed';
END IF;

END;
//

使用MySQL限制,如果没有特殊技巧(如冗余列unique_helpermeta_name为常数值=email,彼此随机+UNIQUE索引,unique_helper+meta_value),这是不可能的。

但您可以在innoDB表中使用自定义TRIGGER:(记住要放yourTable名称)

CREATE TRIGGER triggerName
BEFORE INSERT ON yourTable
FOR EACH ROW
BEGIN
  IF NEW.meta_name = 'email' AND EXISTS (SELECT 1 FROM yourTable WHERE meta_name='email' AND meta_value=NEW.meta_value)
  THEN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Duplicate email';
  END IF;
END;

相关内容

  • 没有找到相关文章

最新更新