我有一个表,其中包含用户的元数据。共有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_helper
,meta_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;