3

ユーザーのメタデータを含むテーブルがあります。4つのフィールドがあります...

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

このテーブルにメールを保存したい。当然、これらは一意でなければなりません。ただし、このテーブルには、データが一意である必要のない他のデータも格納したいと考えています。「email」と等しい'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_nameemailUNIQUEunique_helpermeta_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 に答える