PRIMARY KEY 有几个理想的属性(其中一些非常明显,但我们将列举它们)
- 非空 - (保证每一行的所有 PK 列都有一个非空值)
- 唯一 - (没有两行永远具有相同的一组值。永远)
- 简单 -(单列,本机数据类型)
- short - (集群键将在每个二级索引和外键中重复)
- 不可变——(一旦赋值,值不会改变)
- 匿名 -(不携带任何有意义的信息)
我们可以就这些属性中的每一个、含义和好处以及不具有这些属性的主键的缺点进行讨论。但是很多人最终都会对什么是最重要的,什么是不重要的。)
我有理由认为这些属性中的每一个都是可取的。而且我承认其他人的观点不同。
如果此列表有效,则 代理 主键可以适合所有这些。
在 MySQL 中,实现 代理 主键的一种可能方法是在表中添加一个额外的列:
CREATE TABLE mytable
( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'PK'
, cust_email VARCHAR(255) NOT NULL COMMENT 'UX1'
, cust_name_title
, cust_name_first
, cust_name_last
, cust_name_suffix
, cust_addr_street
, cust_addr_line2
, cust_addr_city
, cust_addr_state
, cust_addr_postal_code
, UNIQUE KEY customer_UX1 (cust_email)
)
请注意,使用 AUTO_INCREMENT 不是要求。这是许多人认为有用且易于使用的功能。 (关于 AUTO_INCREMENT 的一些细节使其在 PRIMARY KEY 方面不够完美。)
重要
我确实不断言使用代理主键是正确的方法,或唯一的方法。
代理主键不是成功的数据库实施项目的要求。许多成功的项目都是使用自然键实现的。
但我会指出(最后)当事实证明(在项目后期,新发现的要求)选择的自然键结果不满足自然键时,一些坚定的自然键信徒已经被严重烧毁(或更多)我列出的“理想属性”。