1

紛らわしいタイトルで申し訳ありませんが、この問題を 1 文で説明する方法がわかりません。

私は一般化されたチップ競争のための SQLite データベースを持っています。概念に慣れていない人のために説明すると、スポーツ競技の各ラウンドの各試合で勝つと思う人が「ヒント」を出し、競技の終わりに最も正しいヒントを持っている人が勝ちます(賞金はお金、プライドかもしれません)など)。オーストラリアでは AFL で非常に人気があります。

基本的な構造は、ユーザーが所有者として登録すると、必要な数のコンペを作成でき、各コンペは外部キーでリンクされるというものです。これは、データベース スキーマの関連部分です。

create table owner (
    owner_id INTEGER NOT NULL,
    owner_name VARCHAR NOT NULL,
    owner_nick VARCHAR UNIQUE NOT NULL,
    owner_email VARCHAR NOT NULL,
    owner_password VARCHAR NOT NULL,
    CONSTRAINT owner_pk PRIMARY KEY (owner_id)
);

create table comp (
    comp_id INTEGER NOT NULL,
    comp_owner_id INTEGER NOT NULL,
    comp_name VARCHAR UNIQUE NOT NULL,
    CONSTRAINT comp_pk PRIMARY KEY (comp_id),
    CONSTRAINT comp_owner_fk FOREIGN KEY (comp_owner_id) REFERENCES owner (owner_id) NOT DEFERRABLE
);

問題の要点は次のとおりです。1 人の所有者が同じ名前のコンペを 2 つ以上持つべきではないため、(上記のように) comp テーブルの comp_name フィールドに一意の制約を適用したいと考えています。ただし、2 人の異なる所有者が、同じ名前の 2 つの異なる大会を希望する可能性は十分にあります (たとえば、同じスポーツ リーグのチップ大会を運営する 2 つのオフィス)。SQL を使用してこれを強制することは可能ですか、それとも他の場所で手動で強制する必要がありますか?

いくつかのメモ:

  • 適切な外部キー制約が適用されている SQLite 3.6.20 を使用しています。
  • データベースが本番レベルのアプリケーションで使用されることはありません。プライベートプロジェクトです。
  • データベースは Web ベースの PHP アプリケーションで使用されています。
  • これが SQLite で実現できない場合、MySQL で実現できますか?

編集: SQLite のテーブル変更のサポートが非常に限られていることを認識していることを指摘しておく必要があると思います。データベースを削除して最初からやり直すことは非常に選択肢です。

4

2 に答える 2

2

UNIQUE次のように、これら2つのフィールドに制約を作成するだけです。

create table comp (
    comp_id INTEGER NOT NULL,
    comp_owner_id INTEGER NOT NULL,
    comp_name VARCHAR NOT NULL,
    CONSTRAINT comp_unq UNIQUE (comp_owner_id, comp_name),
    CONSTRAINT comp_pk PRIMARY KEY (comp_id),
    CONSTRAINT comp_owner_fk FOREIGN KEY (comp_owner_id) REFERENCES owner (owner_id) NOT DEFERRABLE
);

それはあなたが望むことをするはずです。

于 2012-09-15T01:41:27.027 に答える
1

次の構文を使用して、複合UNIQUE制約を作成できます。

create table comp (
    comp_id INTEGER NOT NULL,
    comp_owner_id INTEGER NOT NULL,
    comp_name VARCHAR,
    CONSTRAINT comp_pk PRIMARY KEY (comp_id),
    CONSTRAINT comp_unique UNIQUE (comp_owner_id, comp_name),
    CONSTRAINT comp_owner_fk FOREIGN KEY (comp_owner_id) REFERENCES owner (owner_id) NOT DEFERRABLE
);

懸念事項が既存のテーブルに制約を追加することである場合は、次の方法でそれを行うことができます。

 CREATE UNIQUE INDEX comp_unique (comp_owner_id, comp_name) ON comp

また、owner_id列を失い、ownerテーブルの主キーとしてowner_nameを使用することを検討できます。同様に、そのテーブルに別の候補キーがあるため、comp_idは必要ない場合があります。

于 2012-09-15T01:42:02.907 に答える