web-dev-qa-db-ja.com

異なる名前で同じ一意の制約を作成する

MySQL 5.7の場合

  1. alter table mydb.roles add constraint uk1 unique (role_name);

  2. alter table mydb.roles add constraint uk2 unique (role_name);

2ndalterコマンドで次の警告が表示されました。

テーブル 'world_x.roles'に定義された重複インデックス 'uk2'。これは非推奨であり、将来のリリースでは禁止される予定です。

Postgres(10.x)で同じことを試しても警告は出ませんでした。

では、このシナリオではSQL標準はどうなるのでしょうか。

2
Dinesh Kumar

名前の制約が非常に混乱し、同じ名前であるためクエリが遅くなる可能性があります

多分この結果は役に立ちます

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で修正されました

1
user158679

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>の制約記述子は含まれません。

制約の重複は許可されませんスキーマ全体に対して。余談ですが、仕様には、実装が競合する暗黙の名前を生成できないことも記載されています(一意である必要があります)。

0
Evan Carroll