共计 2408 个字符,预计需要花费 7 分钟才能阅读完成。
这篇文章主要讲解了“MySQL 主键的定义和用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“MySQL 主键的定义和用法”吧!
主键没有着明确的概念定义,其是索引的一种,并且是唯一性索引的一种,且必须定义为“PRIMARY KEY”,是只可意会不可言传的东西。下面让我用通俗,甚至有些低俗的语言为您简单介绍一下 MySQL 的主键。
简单描述:
主键不能重复,就像 QQ 的用户名,有 N 个叫“虫 zi”的网友,可是他们的 QQ 号码是不一样的,也就是说真正标识一个 QQ 的身份是“QQ 号码”。还有那万恶的身份证,无论“张三,李四,王二麻子”这些都不能代表一个人,真正能代表一个人确切身份的就是那个“天朝特色的万恶的身份证”,相当于在杀猪的时候给猪盖个章,说这头是检验过的,有身份的猪,只不过人是生下来用“证”给你确定了,虽然要 18 岁才给你颁发。
不过主键和 QQ 号不一样,因为一个表只能有一个主键,而一个人可以有多个 QQ 号,这也是为什么人们喜欢在虚拟世界里面互相忽悠,因为你真的不知道电脑那面坐的是一头猪。
貌似扯的有点远了,接着来看我们的 mysql 主键。
声明主键的方法:
您可以在创建表的时候就为表加上主键,如:
CREATE TABLE tbl_name ([字段描述省略 …], PRIMARY KEY(index_col_name));
也可以更新表结构时为表加上主键,如:
ALTER TABLE tbl_name ADD PRIMARY KEY (index_col_name,…);
主键示例:
主键被认为是 NOT NULL 和 UNIQUE 约束最好的结合。如果这些列没有被明确地定义为 NOT NULL,MySQL 会隐含地定义这些列。
/*
创建一个 qq 表,将 qq_id 设为主键,且没有对其进行 NOT NULl 约束
*/
create table qq(
qq_id int(10),
nick_name varchar(255) not null,
primary key (qq_id)
)
/*
插入一条数据,将 qq 号设为 10000(咱也幻想一下),昵称设为 simaopig
*/
INSERT INTO qq( qq_id, nick_name )
VALUES (
10000 , simaopig
);
/*
插入一条数据,qq 号仍为 10000,因为数据库内已经存在其 10000 这样的数据,
而且最最主要的是其 QQ 号为主键,所以报错,信息如下
#1062 – Duplicate entry 10000 for key PRIMARY
*/
INSERT INTO qq( qq_id, nick_name )
VALUES (
10000 , chongpig
)
/*
虽然没有将 qq 号字段设 NOT NULL 约束,可是因为其是主键,所以其不能为 NULL
#1048 – Column qq_id cannot be null
*/
INSERT INTO qq( qq_id, nick_name )
VALUES (
NULL , chongpig
)
主键也是索引:
刚才已经说了,主键其实也是索引,甚至在 MySQL 的术语里面“键”就等于“索引”,所以“外键”一定要先设为“索引”,这个咱们下篇日志再来讨论。所以主键也应该和索引一样,既可以作用于单独的字段,又可以作用于多个字段。
举个简的例子吧,我住 3 单元,501 室,我叫小小子,那么只有 3 单元 501 室才能在本小区表里面唯一确定我家。因为 2 单元,501 室住着的可能也是个小小子,所以只有两个字段才能唯一确定我,也就是说可以二者组合作为主键。组合的主键,每个列都会隐含定义 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,因为其是主键。
我们可以看一下 phpmyadmin,看一下 port 字段的默认值为 0,这和昨天我们讲的索引规则是一样的,NOT NULL 并且给设了 DEFAULT,因其是整型所以为 0,如果其为字符串的话,默认值就是”
感谢各位的阅读,以上就是“MySQL 主键的定义和用法”的内容了,经过本文的学习后,相信大家对 MySQL 主键的定义和用法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!