主键没有着明确的概念定义,其是索引的一种,并且是唯一性索引的一种,且必须定义为“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 primaryKey的更多相关文章

  1. 【MySQL】漫谈MySQL中的事务及其实现

    最近一直在做订单类的项目,使用了事务.我们的数据库选用的是MySQL,存储引擎选用innoDB,innoDB对事务有着良好的支持.这篇文章我们一起来扒一扒事务相关的知识. 为什么要有事务? 事务广泛的 ...

  2. 漫谈MySql中的事务

    最近一直在做订单类的项目,使用了事务.我们的数据库选用的是MySql,存储引擎选用innoDB,innoDB对事务有着良好的支持.这篇文章我们一起来扒一扒事务相关的知识. 为什么要有事务? 事务广泛的 ...

  3. (转)漫谈MySql中的事务

    最近一直在做订单类的项目,使用了事务.我们的数据库选用的是MySql,存储引擎选用innoDB,innoDB对事务有着良好的支持.这篇文章我们一起来扒一扒事务相关的知识. 为什么要有事务? 事务广泛的 ...

  4. 【转】哦,mysql 的其它发行版本Percona, mariadb

    原文:http://geek.csdn.net/news/detail/130146 2016年11月25日,沃趣科技"智慧应用 数据先行"2016产品发布会暨新三板挂牌庆祝会在杭 ...

  5. MySQL 体系结构及存储引擎

    MySQL 原理篇 MySQL 索引机制 MySQL 体系结构及存储引擎 MySQL 语句执行过程详解 MySQL 执行计划详解 MySQL InnoDB 缓冲池 MySQL InnoDB 事务 My ...

  6. FlinkSQL 之乱序问题

    乱序问题 在业务编写 FlinkSQL 时, 非常常见的就是乱序相关问题, 在出现问题时,非常难以排查,且无法稳定复现,这样无论是业务方,还是平台方,都处于一种非常尴尬的地步. 在实时 join 中, ...

  7. MySQL · 性能优化· InnoDB buffer pool flush策略漫谈

    MySQL · 性能优化· InnoDB buffer pool flush策略漫谈 背景 我们知道InnoDB使用buffer pool来缓存从磁盘读取到内存的数据页.buffer pool通常由数 ...

  8. Mysql 主键约束PrimaryKey

    Mysql 主键约束Primary Key 今天来简单的讲一下主键约束. 假如有一张学生信息表,里面记录了学生的学号 ,姓名,成绩等,那么,会不会有两个学号相同的学生,答案肯定是否定的,如果有的话也只 ...

  9. mysql杂记漫谈

    Hello,大家好,我是烤鸭,这几天消失了一下,主要是线上系统出了点小bug和sql性能问题,在努力搬砖,就把之前的设计模式系列放了一下下,正好趁这个复习巩固了一下sql执行计划和sql优化等相关的东 ...

随机推荐

  1. CSS 代码是什么?(转)

    转自:http://www.divcss5.com/rumen/r95.shtml CSS 代码是什么,什么是CSS代码? 目录 什么是CSS css代码样子(图) 作用 相关扩展阅读 一.了解什么是 ...

  2. Gradle[0]依赖本地JAR和远程仓库JAR的配置

    1.对本地Jar的依赖配置 如果不知道Jar包的远程仓库地址,而项目中又要使用该Jar包,就需要进行本地设置. 例如,需要使用的Jar包为sigar.jar,则需要在项目根目录下建目录:libs,并把 ...

  3. CSS初始化-KISSY CSS Reset 1.0

    代码 /* KISSY CSS Reset 理念:1. reset 的目的不是清除浏览器的默认样式,这仅是部分工作.清除和重置是紧密不可分的. 2. reset 的目的不是让默认样式在所有浏览器下一致 ...

  4. [原创+实战+钓鱼]setoolkit+映射

    所需工具:setoolkit,花生壳 (此方法主要针对没有服务器,没有空间的攻击者.有服务器或者空间可以直接上传setoolkit的生成源码到服务器或者空间.) 1.setoolkit克隆一个站点 | ...

  5. 【C#正则基础】正则表达式

    1. 代表任意多个字符:(.*?)2. 代表网页里的<body>*</body>任意的标签内容,替换以后网页源码就只剩纯文本:<[^>]*>3. 代表网页中的 ...

  6. 忽略git中不需要进行版本管理的文件

    在git中我们提交项目的时候有很多东西是不需要进行版本管理的,因此我们需要忽略掉. 虽然在github2.0的windows客户端提供了工具,但是这个工具并不是想象中的那么好用. 在上面点右键出现的D ...

  7. Java基础知识强化44:StringBuffer类之把数组拼接成指定格式的字符串的案例

    1. 先看案例代码如下: package cn.itcast_07; /* * 把数组拼接成一个字符串 */ public class StringBufferTest2 { public stati ...

  8. Word03-文档中的截图显示不全

    今天写文档时遇到个很蛋疼的问题,在doc文档中复制进去的截图总是显示不全,图片上半部分都被文字遮盖了,折腾半天,最后还是网上找到了答案. 解决方法如下: 将图片所在行的段落行距修改为其它值即可,原来为 ...

  9. rhel Linux 网络配置

    --网络配置 vi /etc/sysconfig/network-scripts/ifcfg-eth0 1)DHCPDEVICE=eth0BOOTPROTO=dhcpONBOOT=yes2)静态IP  ...

  10. C复习手记(Day3)

    C预处理器 C 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤.简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理.我们将把 C 预处理器 ...