MySQL 5.7の場合
alter table mydb.roles add constraint uk1 unique (role_name);
alter table mydb.roles add constraint uk2 unique (role_name);
2ndalter
コマンドで次の警告が表示されました。
テーブル 'world_x.roles'に定義された重複インデックス 'uk2'。これは非推奨であり、将来のリリースでは禁止される予定です。
Postgres(10.x)で同じことを試しても警告は出ませんでした。
では、このシナリオではSQL標準はどうなるのでしょうか。
名前の制約が非常に混乱し、同じ名前であるためクエリが遅くなる可能性があります
多分この結果は役に立ちます
1つの制約インデックスのみを作成し、必要な列を含める
例
ALTER TABLE users ADD CONSTRAINT findUser UNIQUE (nameUser,emailUser);
二重制約も警告メッセージもなく、SQLルールを存続させる
SQLは標準ですが、同じルールを持つすべての人に同時に実装されているわけではありません。
次のリンクでわかるように、実際にはこれらのシナリオはバグです
https://bugs.mysql.com/bug.php?id=3752
そして最終的に認識されるのは https://bugs.mysql.com/bug.php?id=8565
そして最後にMySQL Server 5.6.7で修正されました
Postgres(10.x)で同じことを試しても警告は出ませんでした。
これは単に真実ではありません。
CREATE TABLE foo ( a int );
ALTER TABLE foo ADD CONSTRAINT uk1 UNIQUE (a);
ALTER TABLE foo ADD CONSTRAINT uk1 UNIQUE (a);
ERROR: relation "uk1" already exists
ただし、PostgreSQLでは、システムが素晴らしく、自動生成された名前が適切に機能するため、ほとんどの人は名前を付けません。
ALTER TABLE foo ADD UNIQUE (a); -- run once
ALTER TABLE foo ADD UNIQUE (a); -- run twice (no problem)
-- run thirce, and four times
ALTER TABLE foo ADD UNIQUE (a), ADD UNIQUE (a);
では、このシナリオではSQL標準はどうなるのでしょうか。
これは、仕様では<table constraint definition>
と呼ばれ、これを示しています(SQL:2011n)。
4)[〜#〜] s [〜#〜]を
<constraint name>
の明示的または暗黙的によって識別されるスキーマとする。 [〜#〜] s [〜#〜]には、制約名が<constraint name>
の制約記述子は含まれません。
制約の重複は許可されませんスキーマ全体に対して。余談ですが、仕様には、実装が競合する暗黙の名前を生成できないことも記載されています(一意である必要があります)。