我在书中遇到了以下SQL:
CREATE TABLE 'categories'(
id SMALLINT NOT NULL AUTO INCREMENT,
category VARCHAR(30) NOT NULL,
PRIMARY KEY('id'),
UNIQUE KEY 'category'('category')
)ENGINE=MyISAM DEFAULT CHARSET = utf8;
Run Code Online (Sandbox Code Playgroud)
我想知道为什么我需要在同一个表中使用PRIMARY和UNIQUE KEY?我想,这个问题的基础是,PRIMARY和UNIQUE键有什么区别?
Mik*_*ll' 20
关系模型表明,一个密钥与另一个密钥之间没有本质区别.也就是说,当关系具有多个候选键时,没有理论上的理由来声明该键比该键更重要.从本质上讲,这意味着没有理论上的理由将一个密钥识别为主密钥,而将所有其他密钥识别为辅助密钥.(但可能有实际的原因.)
许多关系都有不止一个候选键.例如,美国各州的关系可能包含这样的数据.
State Abbr Postal Code
--
Alabama Ala. AL
Alaska Alaska AK
Arizona Ariz. AZ
...
Wyoming Wyo. WY
Run Code Online (Sandbox Code Playgroud)
很明显,这三列中的每一列中的值都是唯一的 - 有三个候选键.
如果您要在SQL中构建一个表来存储这些值,您可能会这样做.
CREATE TABLE states (
state varchar(15) primary key,
abbr varchar(10) not null unique,
postal_code char(2) not null unique
);
Run Code Online (Sandbox Code Playgroud)
而且你会做类似的事情,因为SQL没有任何其他方式可以说"我的表有三个独立的候选键".
我没有任何特别的理由选择"州"作为主键.我可以轻松选择"abbr"或"postal_code".这三列中的任何一列也可以用作外键引用的目标.
就这一点而言,我也可以像这样构建表格.
CREATE TABLE states (
state varchar(15) not null unique,
abbr varchar(10) not null unique,
postal_code char(2) not null unique
);
Run Code Online (Sandbox Code Playgroud)
我很惊讶没有人提到主键可以作为外键引用到其他表中.
此外,唯一约束允许NULL值.
归档时间: |
|
查看次数: |
14156 次 |
最近记录: |