MySQL 之 约束 (主键、唯一、非空、自增、外键)

目的:使得数据更准确,更完整。
约束的分类:
1、键约束
(1)主键约束
(2)唯一键约束
(3)外键约束
2、非空约束
3、默认值约束
4、自增约束

主键约束

(一)概述
1、关键字 :primary key
2、特点:增加主键约束的列(字段)的值必须是非空 + 唯一的,一个表只有一个主键约束
3、作用:保证表中不会出现两条无法区分的记录
4、要求:每一张表都必须有主键约束
5、分类
单列主键约束
复合主键约束
(二)使用主键约束

1、创建主键约束
(1)在建表时指定主键约束
create table 【数据库名.】表名称(字段1 数据类型 primary key,字段2 数据类型,....
);create table 【数据库名.】表名称(字段1 数据类型,字段2 数据类型,....,primary key(字段1)
);例如:
create table dept(id int primary key,name varchar(20),description varchar(100)
);
或
create table dept(id int ,name varchar(20),description varchar(100),primary key(id)
);
mysql> desc dept;
+-------------+--------------+------+-----+---------+-------+
| Field       | Type         | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| id          | int(11)      | NO   | PRI | NULL    |       |
| name        | varchar(20)  | YES  |     | NULL    |       |
| description | varchar(100) | YES  |     | NULL    |       |
+-------------+--------------+------+-----+---------+-------+insert into dept values(1,'财务部','发钱的');
insert into dept values(1,'财务部','发钱的');mysql> insert into dept values(1,'财务部','发钱的');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'(2)建表后指定主键约束
create table dept(id int,name varchar(20),description varchar(100)
);
修改表结构:
alter table dept add primary key(id);2、删除主键约束
修改表结构
alter table 表名称 drop primary key;例如:
alter table dept primary key;3、复合主键
(1)在建表时指定主键约束
create table 【数据库.】表名称(字段1 数据类型,字段2 数据类型,字段3 数据类型,...,primary key(字段列表)
);
说明:复合主键不能在列后面加,需要单独指定(2)建表后指定主键约束
alter table 【数据库.】表名称 add primary key(字段列表);例如:
create table stu(sid int primary key,  #学号sname varchar(20)     #姓名
);
create table course(cid int primary key,        #课程编号cname varchar(20)      #课程名称
);
create table score(sid int,     #学号cid int,     #课程编号score int      #对应的成绩
);insert into stu values(1,'张三'),(2,'李四');
insert into course values(1001,'java'),(1002,'mysql');
insert into score values(1,1001,89),(1,1002,90),(2,1001,56),(2,1002,69);mysql> select * from stu;
+-----+-------+
| sid | sname |
+-----+-------+
|   1 | 张三      |
|   2 | 李四      |
+-----+-------+
2 rows in set (0.00 sec)mysql> select * from course;
+------+-------+
| cid  | cname |
+------+-------+
| 1001 | java  |
| 1002 | mysql |
+------+-------+
2 rows in set (0.00 sec)mysql> select * from score;
+------+------+-------+
| sid  | cid  | score |
+------+------+-------+
|    1 | 1001 |    89 |
|    1 | 1002 |    90 |
|    2 | 1001 |    56 |
|    2 | 1002 |    69 |
+------+------+-------+
4 rows in set (0.00 sec)alter table score add primary key(sid,cid);create table score(sid int,      #学号cid int,     #课程编号score int,     #对应的成绩primary key(sid,cid)
);变通成如下这种:
create table score(id int,          #没有业务意义,只是唯一标记一行sid int,     #学号cid int,     #课程编号score int,     #对应的成绩primary key(id)
);

唯一键约束

(一)概述
1、关键字:unique key
2、特点:指定了唯一键的列的值必须唯一,不能重复
3、作用:给主键以外的列,限定唯一性
4、唯一键分类
单列的唯一
复合唯一

唯一键和主键的区别:
(1)主键不能为空,唯一键可以为空
(2)主键约束,一个表只能有一个,而唯一键可以有很多个

(二)使用唯一键

1、如何创建/指定唯一键
(1)在建表时
create table 【数据库名.】表名称(字段1 数据类型  primary key,字段2 数据类型 【unique key】,字段3 数据类型 【unique key】,...
);
或
create table 【数据库名.】表名称(字段1 数据类型  primary key,字段2 数据类型 ,字段3 数据类型 ,...,unique key(字段2),  #分别唯一unique key(字段3)
);create table 【数据库名.】表名称(字段1 数据类型  primary key,字段2 数据类型 ,字段3 数据类型 ,...,unique key(字段列表)  #复合唯一
);create table emp(eid int primary key,  #员工编号ename varchar(20),   #姓名cardid varchar(18)  unique key,       #身份证号tel varchar(11) unique key
);insert into emp values(1,'张三','123456789123456789','12345678912');
insert into emp values(2,'李四','123456789123456788','12345678912');mysql> insert into emp values(2,'李四','123456789123456788','12345678912');
ERROR 1062 (23000): Duplicate entry '12345678912' for key 'tel'(2)在建表后
修改表结构:
alter table 【数据库名.】表名称 add unique key(字段名);
alter table 【数据库名.】表名称 add unique key(字段列表);  #复合唯一2、删除唯一键
修改表结构:
alter table 【数据库名.】表名称 drop index 索引名;如果不知道索引名,可以通过如下的语句查询:
show index from 表名称;alter table emp drop unique key;  #错误的
alter table emp drop unique key(cardid);  #错误的
alter table emp drop index cardid;

索引:index
作用:为了提高查询效率,而设置索引
我们的键约束(主键、唯一键、外键),都会自动创建索引。
因为既然你建立键约束,那么该列的值一定很关键,那么在实际中肯定经常用他们的值来查询。
因此,为了提高查询效率,会自动在这些列上增加索引。

非空和默认值约束

1、如何指定非空约束
(1)建表时
create table emp(eid int primary key,  #员工编号ename varchar(20) not null,   #姓名cardid varchar(18)  unique key not null ,      #身份证号tel varchar(11) unique key not null,gender char not null default '男'
);insert into emp values(1,'张三','111','10086','女');
insert into emp values(2,'李四','111','女');  #错误的,原因是值的数量和列的数量不匹配
insert into emp(eid,ename,cardid,gender) values(2,'李四','111','女');   #错误的  因为tel设置非空,但是又没指定默认值
insert into emp(eid,ename,cardid,tel) values(2,'李四','222','10010');
insert into emp values(3,'王五','3333','10011',default); (2)建表后
create table 【数据库名.】表名称(字段1 数据类型 primary key,字段2 数据类型 【unique key】【not null】【default 默认值】,字段2 数据类型 【unique key】【not null】【default 默认值】,...
);create table emp(eid int primary key,  #员工编号ename varchar(20) not null,   #姓名cardid varchar(18)  unique key  ,        #身份证号tel varchar(11) unique key ,gender char
);alter table emp modify cardid varchar(18) unique key  not null;
alter table emp modify tel varchar(11)   not null;
alter table emp modify gender char not null default '男';2、如何去掉非空和默认值约束alter table emp modify gender char ;

自增约束

1、关键字:auto_increment
2、特点:
(1)一个表只能有一个自增列
(2)自增列必须是整型的
(3)自增列必须是键列,例如:主键,唯一键

3、如何指定自增create table emp(eid int primary key auto_increment,ename varchar(20) not null
);insert into emp values(2,'张三');
insert into emp(ename)values('李四');
insert into emp values(0,'王五');
insert into emp values(null,'赵六');

外键约束(了解)

外键约束不是必须的,而且现在很多大的公司,数据量比较大时,不建议在数据库层面设计外键,
因为他觉得这样效率低,把这个数据的约束挪到代码层面去判断。

(一)概述
1、关键字:foreign key
2、特点:
(1)约束的是两张表的关系
需要两张表,或者一张表虚拟成两张表
(2)两张表分为主表(父表)和从表(子表)
外键的建立/指定是在从表(子表)上建立。
(3)被参考的表称为主表,主表的被参考列必须是主键或唯一键
(4)一个表可以有多个外键

(二)如何指定外键
1、在建表时指定外键
要求:

(1)建表的顺序
先建主表,再建从表
从表的语法:
create table 【数据库名.】表名称(字段1 数据类型  primary key,字段2 数据类型 【unique key】【not null】【default 默认值】,字段3 数据类型 【unique key】【not null】【default 默认值】,...,foreign key(从表的外键列) references 主表名(主表被参考的列名)
);
(2)删表的顺序
先删从表,再删除主表
(3)添加/修改从表数据
添加/修改从表记录时,引用主表的列的值必须是存在的。
例如:添加/修改员工表时,员工所在部门的值必须引用部门表的部门编号,保证该部门编号是存在的。
(4)删除/修改主表记录
A:默认情况下,如果主表的被参考列的值被引用,那么就不能轻易的被删除和修改。
例如:2号部门被员工引用了,那么这个2号部门就不能被删除,并且2这个编号值不能被修改。foreign key(从表的外键列) references 主表名(主表被参考的列名) 【on update restrict/no action】 【on delete restrict/no action】
B:如果在建立外键时,指定了“级联”策略,那么可以做到级联修改和删除foreign key(从表的外键列) references 主表名(主表被参考的列名) 【on update cascade】 【on delete cascade】
C:如果在建立外键时,指定了“置空”策略,那么可以做到主表的记录被修改或删除时,从表的对应字段变为NULLforeign key(从表的外键列) references 主表名(主表被参考的列名) 【on update set null】 【on delete set null】#部门表:主表
create table dept(did int primary key,      #部门编号dname varchar(20) not null unique key,  #部门名称description varchar(100)              #部门简介
);
insert into dept values(1,'财务部','发钱的'),(2,'后勤部','发礼物的');#职位表:主表
create table job(jid int primary key,       #职位编号title varchar(20) not null , #职位名称description varchar(100) #职位简介
);
insert into job values(1,'会计','算钱的'),(2,'助理','修电脑的');#员工表:从表
create table emp(eid int primary key,           #员工编号ename varchar(20) not null,  #员工姓名deptid int,    #所在的部门编号   deptid可以取名didjobid int,     #职位编号foreign key(deptid) references dept(did),foreign key(jobid) references job(jid) on update set null on delete set null
);insert into emp values(1,'张三',1,1),(2,'李四',1,1),(3,'王五',2,2),(4,'赵六',2,2);2、建表后指定外键
alter table 从表名称 add foreign key(从表的字段) references 主表名(主表被参考的列名);

MySQL 之 约束 (主键、唯一、非空、自增、外键)相关推荐

  1. Mysql完整性约束详解(字段唯一,非空,主键primary key,外键foreign key,自增长auto_increment)

    引入 1.什么是完整性约束, 为什么使用 为了规范数据格式, 在用户进行插入.修改.删除等操作时,DBMS(数据库管理系统(Data Base Management System))自动按照约束条件对 ...

  2. 【MySQL - 5】约束是什么?非空约束、唯一约束、主键约束、外键约束有什么作用?

    目录 1. 非空约束 2. 唯一约束 3. 主键约束 自动增长 4. 外键约束 级联操作 首先我们来想象一下,前几篇文章在我们操作数据库的过程中,自由度是很高的,想给哪个赋值就给哪个赋值,但是这样子, ...

  3. oracle去除检查非空,oracle 主键,非空,检查,唯一,默认,外键约束

    --首先添加主键约束 alter table student add constraint PK_student_sno primary key(sno) --删除约束 alter table stu ...

  4. 不是oracle约束的是,oracle--约束(主键、非空、检查)

    - 问题1:学号重复了,数据还可以插入成功 使用主键约束:学号是唯一标识一条数据的,所以必须唯一且不能为空 -(1).在确定为主键的字段后添加 primary key关键字 -(2).在创建表的后面使 ...

  5. MySQL数据库约束(主键约束,外键约束详解)

    关系型数据库的一个重要功能: 需要保证数据的"完整性",可以通过人工的方式来观察确认数据的正确性,这种方式是可行的,但是不合适,因为人为控制的方式势必会存在疏忽,导致一些错误没有被 ...

  6. mysql删除表外键_MySQL删除所有表的外键约束、禁用外键约束

    数据库的外键虽然能保证数据数据一致性和完整性,但是也一定程度地影响了数据更新的性能.在开发中,我们使用PowerDesigner建立物理数据模型时,为了结构的清晰,增加可读性,会创建表与表之间的关联关 ...

  7. mysql添加数据不阻塞_主键表插入数据不提交,外键表插入数据被阻塞

    有客户和我说:他在含主外键的表中实验发现,在主表数据未提交,然后在外键表插入该数据数据时,出现外键表hang住现象.我开始以为是不同的会话,根据oracle数据库的一致性原则,应该新会话在外键表中不能 ...

  8. mysql中外键的作用是什么_mysql外键基本功能与用法详解

    本文实例讲述了mysql外键基本功能与用法.分享给大家供大家参考,具体如下: 本文内容: 什么是外键 外键的增加 外键的修改和删除 外键的约束模式 首发日期:2018-04-12 什么是外键: 外键就 ...

  9. Oracle数据库-主键(primary key)、外键(foreign key)、候选键(candidate key)、超键(super key)和references总结...

    主要介绍一下个人对主键(primary key).外键(foreign key).候选键(Candidate key).超键(super key).references的总结 概念: 主键:用户选择元 ...

  10. mysql外键设置sql语句_sql设置外键(设置外键的sql语句)

    sql设置外键(设置外键的sql语句) 2020-07-24 11:44:03 共8个回答 sql怎么设置外键 创建数据库时就是有主键的创建了主键,但是表之间的关系没有联系,要建数据库关系图只有主键没 ...

最新文章

  1. 用jquery调用wcf下的各种错误码的解释。
  2. 介绍一些好用的ArcToolbox工具(默认ArcGIS没有)
  3. 知识图谱需要解决的问题
  4. 八、华为鸿蒙HarmonyOS应用开发之Java UI框架、常用TextField组件使用
  5. java 定义方法_java如何定义方法
  6. LeetCode(566)——重塑矩阵(JavaScript)
  7. Linux学习之旅(二)Linux文档操作
  8. 通过调用百度生成短连接API接口,将长链接转换成短链接,并且生成短网址并返回,用户可以通过短连接访问,然后浏览器会解析跳转至长链接地址,有效的解决用户修改url后面的参数
  9. 陈洁kiki宠粉节狂欢夜观看破千万!四年磨一剑将宠粉做到极致
  10. 1002. 写出这个数 (20)练习
  11. vCenter Server CA证书下载
  12. E-R图画法解析----概念模型的一种表示方法
  13. 国际物联网展亮相中国苏州 成功促进产业链交流与合作
  14. 终于有人把 ZFS 文件系统讲明白了
  15. 极客日报:日本的首颗 5nm 芯片公布;虾米音乐正式关停;网易云音乐再次喊话酷狗...
  16. 地信、遥感专业各类官网收集(持续更新)
  17. 开源免费erp ,erp5和odoo的对比
  18. 蓝牙耳机链接电脑(windows)莫名奇妙关机问题/老是关机问题
  19. 【智能优化算法】基于凌日算法求解单目标优化问题附matlab代码Transit Search Optimization Algorithm
  20. 搭建Vue版Ant Design Pro后台管理系统

热门文章

  1. spring mvc请求的时候是如何找到正确的Controller
  2. Hibernate概述
  3. Deepin 系统下安装VMware并激活
  4. 桥接网络,nat网络,静态IP配置,相关命令
  5. 【李宏毅2020 ML/DL】补充:Ensemble: Bagging, Boosting, Adaboost, Gradient Boosting, Stacking
  6. 【数据结构笔记23】C实现:表示图的多种方法(邻接矩阵、邻接表与相关拓展)
  7. root用户重置其他密码
  8. 开发打开设置洁面_用了两到三年的华为手机,一键打开开发者选项,帮助性能加速...
  9. mysql库垂按照模块_前任都能看懂的分库分表方案
  10. 关于vmware中的centos无法ping通宿主机或者是外网的解决思路