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) 有一个顺序 ID (OID)。

虽然在设置主键后它会自动生成我的 OID 字段NOT NULL

作为一种解决方法,我正在考虑存储0而不是将其标记为不相关的字段。

references那么,现在的问题是,除了指定字段之外,是否可以允许外键约束也接受零(0) ?

4

4 回答 4

1

一种选择是使用“代理主键”而不是您当前的 PK,而是UNIQUE对以下复合(UID,OID)施加约束 - 前提是您愿意拥有代理主键 - 就像身份列

于 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

作为旁注,我承认我对这种情况有点惊讶。交集表通常设计为没有任何可为空的字段:例如,查询中的 LEFT(或 RIGHT)JOIN 应该用于包含没有任何订单的用户。您能否解释一下为什么第一手选择了这个决定(使 OID 可以为空)?

于 2012-08-31T09:26:12.513 回答
0

尝试使用唯一键。它允许使用 NULL 值。

于 2012-08-31T09:30:05.400 回答