MySQL唯一键仅在另一个键包含特定值的情况下

时间:2012-09-12 09:19:04

标签: mysql mysql5

我有一个包含用户元数据的表。有4个领域......

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

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

2 个答案:

答案 0 :(得分:6)

通过MySQL的约束 - 没有。

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

以下是插入触发器的草稿(您可以在此处使用它: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;

//

答案 1 :(得分:2)

如果没有特殊技巧(例如冗余列unique_helpermeta_name = email的值为UNIQUEunique_helper = meta_value,则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; {1}} + {{1}})。

但是你可以在innoDB表中使用自定义TRIGGER :(记住{{1}}名称)

{{1}}