Home >Database >Mysql Tutorial >MySQL 零散笔记--主键_MySQL

MySQL 零散笔记--主键_MySQL

WBOY
WBOYOriginal
2016-06-01 13:51:331032browse

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组合确定一个防火墙

<pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #fbfbfb;">/*
创建防火墙表,将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)
)
<pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #fbfbfb;">/* 
插入一条新的记录,没有啥问题 
1 row(s) inserted. 
*/ 
INSERT INTO firewall ( 
host , 
port , 
access 
) 
VALUES ( 
'202.65.3.87', '21', 'deny' 
);
<pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #fbfbfb;">/* 
插入失败,因为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' 
);
<pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #fbfbfb;">/* 
没声明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,因为其是主键。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn