2

次のテーブルがあるとします。

UID int (11) not null,  FOREIGN KEY (UID) REFERENCES users(ID),
OID int (11),  FOREIGN KEY (OID) REFERENCES orders(ID),
primary key(UID,OID)

主キーに注意してください。

NULLそして、各ユーザー ID (UID) に対して1 つのオーダー ID (OID) を持つことを許可したいと考えました。

ただし、主キーを設定すると、自動的に OID フィールドになりますNOT NULL

回避策0として、無関係なフィールドとしてマークする代わりに保存することを考えています。

referencesでは、ここで問題となるのは、外部キー制約が、指定されたフィールド以外のゼロ (0) も受け入れることを許可することは可能ですか?

4

4 に答える 4

1

1つのオプションは、現在のPKの代わりに「代理主キー」を持ち、代わりにUNIQUE次の複合(UID、OID)に制約を課すことです-代理主キーを持つことにオープンである場合-ID列のように

于 2012-08-31T09:26:53.573 に答える
0

MySQL では不可能だと思いますが、回避策として、外部テーブルを参照する際に値が 0 のダミー エントリを挿入することが考えられます。

于 2012-08-31T09:22:39.560 に答える
0

UNIQUE KEYこの場合、制約を使用できます。

CREATE TABLE users (id int not null, primary key (id));
INSERT INTO users VALUES (1), (2), (3);

CREATE TABLE orders (id int not null, primary key (id));
INSERT INTO orders VALUES (1), (2), (3);

CREATE TABLE users_orders (uid int NOT NULL, oid int DEFAULT NULL,
                 FOREIGN KEY (uid) REFERENCES users (id),
                 FOREIGN KEY (oid) REFERENCES orders (id),
                 UNIQUE KEY (uid, oid));

INSERT INTO users_orders (uid) VALUES (1);

ここにデモがあります。

ただし、(おそらく) の複数の組み合わせをspecific UID - NULLテーブルに挿入できることに注意してください (ここでは を使用していると仮定しますInnoDB)。たとえば、このクエリ...

INSERT INTO users_orders o (uid) VALUES (1), (1);

... 同様に成功します (既存の制約を壊さないため)。

これを厳密に禁止する必要がある場合は、とテーブルの両方でダミー値を使用して、交差テーブルの制約を使用できるようにすることをお勧めします。usersordersforeign key

補足として、私はこの状況に少し驚いていることを認めます。交差テーブルは通常、NULL 可能なフィールドがないように設計されています。たとえば、注文を持たないユーザーを含めるために使用する必要があるのは、クエリの LEFT (または RIGHT) JOIN です。(OID を null 可能にするという) この決定が最初に選択された理由を少し説明していただけますか?

于 2012-08-31T09:26:12.513 に答える
0

UNIQUE KEY を使用してみてください。NULL 値を使用できます。

于 2012-08-31T09:30:05.400 に答える