我有一个包含用户元数据的表。有4个字段...
`ID`,`meta_name`,`meta_value`,`user_id`
我想将电子邮件存储在此表中。当然,这些必须是唯一的。但是,我也想在此表中存储其他数据,其中数据不需要是唯一的。有什么方法可以限制'meta_value'
为唯一,只有'meta_name'
等于'电子邮件'?
通过 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;
//
使用 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;