1

与えられた:

create table list(a bigint not null, b bigint not null);
insert into list(a, b) values(1, 1);
insert into list(a, b) values(1, 2);
insert into list(a, b) values(2, 1);
insert into list(a, b) values(1, 2);

次の制約を実装するにはどうすればよいですか?

  1. 値のリストが重複しないようにします。例: (1, 2) は (1, 2) と競合します。
  2. 値のセットが重複しないようにします。例: (1, 2) は (2, 1) と競合します。
  3. SQL UNIQUE 制約は、値のリスト (順序が重要な場合) または値のセット (順序が無視される場合) に適用されますか?

更新: データベースに依存しない回答を探しています。それが不可能な場合は、データベース固有の回答が受け入れられます。

みんな、質問に答えているなら、答えを投稿してください。コメントは、質問について質問するために予約されています。

4

2 に答える 2

4

3 番目の質問は「はい」というシンプルなものです。一意性は、列の順序 (質問の値のリスト) に基づいています。

リストの最初の項目は、一意の制約 (または同等の一意のインデックス) によって処理できます。

2 番目の項目は、多くのデータベースで利用できるトリックで処理できます。チェック制約は、a<を検証できbます。組み合わせることで、(1) と (2) の両方が保証されます。

「チェック」メソッドをより使いやすくするために、「挿入前」トリガーを追加できます。このトリガーは値を交換するためa、最小です。

トリガーの条件を確認することもできます (ただし、トリガーの構文はデータベースによって少し異なります)。

以上が一般的なルールです。

異なるデータベースは、異なるレベルの機能を提供します。たとえば、Oracle は関数インデックスをサポートしているため、a と b の最小値と a と b の最大値に一意のインデックスを明示的に設定できます。SQL Server には、永続化できる計算列が用意されています。これらを一意の制約に含めることができます。

于 2013-05-31T22:37:17.227 に答える
2

DBMS によっては、次のような一意のインデックスを作成できます。

create unique index idx_ab on list(greatest(a,b), least(a,b));

(私が間違っていなければ、これは少なくとも Postgres、Oracle、および DB2 で動作するはずです)

SQLFiddle の例: http://sqlfiddle.com/#!12/5add4/1

于 2013-05-31T22:48:02.897 に答える