我几乎从不创建没有数字主键的表。如果还有一个自然键应该是唯一的,那么我还在它上面添加了一个唯一索引。联接在整数上比多列自然键更快,数据只需要在一个地方更改(自然键往往需要更新,这在主键-外键关系中是一件坏事)。如果需要复制,请使用 GUID 而不是整数,但在大多数情况下,我更喜欢用户可读的密钥,特别是如果他们需要看到它来区分 John Smith 和 John Smith。
CREATE TABLE table1 (foo int, bar int);
CREATE UNIQUE INDEX ux_table1_foo ON table1(foo); -- Create unique index on foo.
INSERT INTO table1 (foo, bar) VALUES (1, 2); -- OK
INSERT INTO table1 (foo, bar) VALUES (2, 2); -- OK
INSERT INTO table1 (foo, bar) VALUES (3, 1); -- OK
INSERT INTO table1 (foo, bar) VALUES (1, 4); -- Fails!
Duplicate entry '1' for key 'ux_table1_foo'