Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅当另一个键包含特定值时才使用MySQL唯一键_Mysql_Mysql5 - Fatal编程技术网

仅当另一个键包含特定值时才使用MySQL唯一键

仅当另一个键包含特定值时才使用MySQL唯一键,mysql,mysql5,Mysql,Mysql5,我有一个包含用户元数据的表。有4个字段 `ID`,`meta_name`,`meta_value`,`user_id` 我想在这个表中存储电子邮件。当然,这些必须是独一无二的。但是,我也希望在这个表中存储其他数据,其中的数据不需要是唯一的。只有当'meta\u name'等于'email'时,我有没有办法限制'meta\u value'是唯一的?通过MySQL的约束-否 不过,您可以使用insert/update触发器来验证数据的唯一性并禁止非法操作 这是插入触发器的草稿(您可以在此处使用它:

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

`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;