3

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

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

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

4

2 回答 2

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;

//
于 2012-09-12T09:21:35.587 回答
3

使用 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;
于 2012-09-12T09:47:49.150 回答