仅当另一个键包含特定值时才使用MySQL唯一键
我有一个包含用户元数据的表。有4个字段仅当另一个键包含特定值时才使用MySQL唯一键,mysql,mysql5,Mysql,Mysql5,我有一个包含用户元数据的表。有4个字段 `ID`,`meta_name`,`meta_value`,`user_id` 我想在这个表中存储电子邮件。当然,这些必须是独一无二的。但是,我也希望在这个表中存储其他数据,其中的数据不需要是唯一的。只有当'meta\u name'等于'email'时,我有没有办法限制'meta\u value'是唯一的?通过MySQL的约束-否 不过,您可以使用insert/update触发器来验证数据的唯一性并禁止非法操作 这是插入触发器的草稿(您可以在此处使用它:
`ID`,`meta_name`,`meta_value`,`user_id`
我想在这个表中存储电子邮件。当然,这些必须是独一无二的。但是,我也希望在这个表中存储其他数据,其中的数据不需要是唯一的。只有当
'meta\u name'
等于'email'时,我有没有办法限制'meta\u value'
是唯一的?通过MySQL的约束-否
不过,您可以使用insert/update触发器来验证数据的唯一性并禁止非法操作
这是插入触发器的草稿(您可以在此处使用它:):
使用MySQL控件,如果没有特殊的技巧(比如冗余列
unique\u helper
为meta\u name
=email
设置常量值,并为彼此设置随机+unique
索引unique\u helper
+meta\u value
)
但您可以在innoDB表中使用自定义触发器:(记住将yourTable
name)
直接从db?您必须创建一个存储过程来添加到此表中,当meta_name为email时,您需要执行表锁定,检查email,然后解锁tableNo,这正是不使用这种设计的原因。如果
meta_name
可能值的数量很小,则将它们定义为列(然后放置约束将很简单);否则,请考虑将它们存储在不同的表中。Kuba,是否可以添加唯一约束,使其满足我上面概述的要求?(唯一性取决于另一个键)不,正如我说的:“通过MySQL的约束-不”。对不起,我在阅读你的回复时弄糊涂了-我指的是更新触发器,而不是唯一的约束。请考虑到,SIGNAL
仅在MySQL>5.5或其他版本中可用。感谢rogal111,我没有听说过SIGNAL-我会研究它。
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;
//
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;