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);
...也会成功(因为它不会破坏任何现有的约束)。
如果这应该被严格禁止,你最好在表和表中都使用一些虚拟值——以使你的交集表中的约束可用。users
orders
foreign key
作为旁注,我承认我对这种情况有点惊讶。交集表通常设计为没有任何可为空的字段:例如,查询中的 LEFT(或 RIGHT)JOIN 应该用于包含没有任何订单的用户。您能否解释一下为什么第一手选择了这个决定(使 OID 可以为空)?