ALTER TABLE `test` ADD UNIQUE (
`a` ,
`b`
);
この一意のキーを作成した後、B、A を追加できないようにしたい。
例: "Michael", "Jackson" の後に "Jackson", "Michael" を挿入することはできません。
ALTER TABLE `test` ADD UNIQUE (
`a` ,
`b`
);
この一意のキーを作成した後、B、A を追加できないようにしたい。
例: "Michael", "Jackson" の後に "Jackson", "Michael" を挿入することはできません。
アプリケーションが実名以外のものを扱っていると仮定します。("Jackson Michael" は英語で正当な名前だからです。"John David" と "David John" も同様です。)
最も簡単な方法は、CHECK() 制約を使用して、2 つの列の間でアルファベット順を強制することです。
alter table test
add constraint test_alpha_order
check (a < b);
ただし、大文字と小文字の区別の問題も発生する可能性があることに注意してください。つまり、dbms は、{'Jackson', 'Michael'} と {'jackson', 'michael'} が 2 つの異なる有効な値であると考える可能性があります。大文字と小文字の区別が問題である場合、私が見た最も一般的な解決策は、このように小文字の値を強制することです。
alter table test
add constraint test_alpha_order
check (a = lower(a) and
b = lower(b) and
a < b );
MySQL のチェック制約の欠如に関する私のコメントに関連して、よく知られている回避策が引き金となっています。BEFORE INSERT ON トリガーの一部として、次のチェックを行います。
SELECT COUNT(*) from mytable WHERE b=NEW.a and a=NEW.b
しかし、これを失敗させるには、MySQL Trickery 1.0 に頼る必要があります (以前、INSERT が失敗する原因となる TRIGGER で説明しましたか? 可能ですか? ) 。
したがって、次のようなものが必要になります: (テスト済み)
delimiter |
CREATE TRIGGER t1
BEFORE INSERT ON mytable
FOR EACH ROW
BEGIN
set @x = (SELECT COUNT(*) FROM mytable WHERE b=NEW.a and a=NEW.b);
IF (@x > 0) THEN
set @y = (SELECT noSuchField FROM mytable);
END IF;
END;
|
注:ここでは大文字と小文字を区別しないことを無視しています-あなたの質問はそれを必要としていないようです.