Reference: 《淺談MySQL主鍵》 作者:simaopig
主鍵沒有著明確的概念定義,其是索引的一種,並且是唯一性索引的一種,且必須定義為“PRIMARY KEY”。
聲明方法:
CREATE TABLE tbl_name ([欄位描述省略...], PRIMARY KEY(index_col_name));
或者
CREATE TABLE tbl_name( id INT(10) PRIMARY KEY |…);
或者更新表結構:
ALTER TABLE tbl_name ADD PRIMARY KEY (index_col_name,…);
主鍵被認為是NOT NULL和UNIQUE約束最好的結合。如果這些列沒有被明確地定義為NOT NULL,MySQL會隱含地定義這些列。
同時,主鍵也是索引。索引可以用於多欄位,主鍵也一樣,既可以作用於單獨的欄位,又可以作用於多個欄位。組合的主鍵,每個列都會隱含定義NOT NULL約束,且其二者加在一起被定義了UNIQUE 惟一約束。
例子代碼:一個防火牆,由host和port組合確定一個防火牆
/*
建立防火牆表,將host 和port組合設為主鍵,注意我沒有將port設NOT NULL約束
*/
create table firewall(
host varchar(11) not null,
port smallint(4),
access enum('deny', 'allow') not null,
primary key (host,port)
)
/*
插入一條新的記錄,沒有啥問題
1 row(s) inserted.
*/
INSERT INTO firewall (
host ,
port ,
access
)
VALUES (
'202.65.3.87', '21', 'deny'
);
/*
插入失敗,因為host 加port的主索引值202.65.3.87-21已經存在了
#1062 - Duplicate entry '202.65.3.87-21' for key 'PRIMARY'
*/
INSERT INTO firewall (
host ,
port ,
access
)
VALUES (
'202.65.3.87', '21', 'allow'
);
/*
沒聲明NOT NULl port也不能為NULL
#1048 - Column 'port' cannot be null
*/
INSERT INTO firewall( host, port, access )
VALUES (
'192.168.0.1', NULL , 'deny'
)
host和port都可以重複,但是不能同時重複,因為其是組合主鍵。且二者都不能被插入NULL,因為其是主鍵。