MySQL主键的意义和用法
发布时间:2022-01-20 11:12:00 所属栏目:MySql教程 来源:互联网
导读:这篇文章主要讲解了MySQL主键的定义和用法,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习MySQL主键的定义和用法吧! 主键没有着明确的概念定义,其是索引的一种,并且是唯一性索引的一种,且必须定义为PRIM
这篇文章主要讲解了“MySQL主键的定义和用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“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主键的定义和用法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |