ユーザーのメタデータを含むテーブルがあります。4つのフィールドがあります...
`ID`,`meta_name`,`meta_value`,`user_id`
このテーブルにメールを保存したい。当然、これらは一意でなければなりません。ただし、このテーブルには、データが一意である必要のない他のデータも格納したいと考えています。「email」と等しい'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;