MySQL 之 约束 (主键、唯一、非空、自增、外键)
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 之 约束 (主键、唯一、非空、自增、外键)相关推荐
- Mysql完整性约束详解(字段唯一,非空,主键primary key,外键foreign key,自增长auto_increment)
引入 1.什么是完整性约束, 为什么使用 为了规范数据格式, 在用户进行插入.修改.删除等操作时,DBMS(数据库管理系统(Data Base Management System))自动按照约束条件对 ...
- 【MySQL - 5】约束是什么?非空约束、唯一约束、主键约束、外键约束有什么作用?
目录 1. 非空约束 2. 唯一约束 3. 主键约束 自动增长 4. 外键约束 级联操作 首先我们来想象一下,前几篇文章在我们操作数据库的过程中,自由度是很高的,想给哪个赋值就给哪个赋值,但是这样子, ...
- oracle去除检查非空,oracle 主键,非空,检查,唯一,默认,外键约束
--首先添加主键约束 alter table student add constraint PK_student_sno primary key(sno) --删除约束 alter table stu ...
- 不是oracle约束的是,oracle--约束(主键、非空、检查)
- 问题1:学号重复了,数据还可以插入成功 使用主键约束:学号是唯一标识一条数据的,所以必须唯一且不能为空 -(1).在确定为主键的字段后添加 primary key关键字 -(2).在创建表的后面使 ...
- MySQL数据库约束(主键约束,外键约束详解)
关系型数据库的一个重要功能: 需要保证数据的"完整性",可以通过人工的方式来观察确认数据的正确性,这种方式是可行的,但是不合适,因为人为控制的方式势必会存在疏忽,导致一些错误没有被 ...
- mysql删除表外键_MySQL删除所有表的外键约束、禁用外键约束
数据库的外键虽然能保证数据数据一致性和完整性,但是也一定程度地影响了数据更新的性能.在开发中,我们使用PowerDesigner建立物理数据模型时,为了结构的清晰,增加可读性,会创建表与表之间的关联关 ...
- mysql添加数据不阻塞_主键表插入数据不提交,外键表插入数据被阻塞
有客户和我说:他在含主外键的表中实验发现,在主表数据未提交,然后在外键表插入该数据数据时,出现外键表hang住现象.我开始以为是不同的会话,根据oracle数据库的一致性原则,应该新会话在外键表中不能 ...
- mysql中外键的作用是什么_mysql外键基本功能与用法详解
本文实例讲述了mysql外键基本功能与用法.分享给大家供大家参考,具体如下: 本文内容: 什么是外键 外键的增加 外键的修改和删除 外键的约束模式 首发日期:2018-04-12 什么是外键: 外键就 ...
- Oracle数据库-主键(primary key)、外键(foreign key)、候选键(candidate key)、超键(super key)和references总结...
主要介绍一下个人对主键(primary key).外键(foreign key).候选键(Candidate key).超键(super key).references的总结 概念: 主键:用户选择元 ...
- mysql外键设置sql语句_sql设置外键(设置外键的sql语句)
sql设置外键(设置外键的sql语句) 2020-07-24 11:44:03 共8个回答 sql怎么设置外键 创建数据库时就是有主键的创建了主键,但是表之间的关系没有联系,要建数据库关系图只有主键没 ...
最新文章
- 用jquery调用wcf下的各种错误码的解释。
- 介绍一些好用的ArcToolbox工具(默认ArcGIS没有)
- 知识图谱需要解决的问题
- 八、华为鸿蒙HarmonyOS应用开发之Java UI框架、常用TextField组件使用
- java 定义方法_java如何定义方法
- LeetCode(566)——重塑矩阵(JavaScript)
- Linux学习之旅(二)Linux文档操作
- 通过调用百度生成短连接API接口,将长链接转换成短链接,并且生成短网址并返回,用户可以通过短连接访问,然后浏览器会解析跳转至长链接地址,有效的解决用户修改url后面的参数
- 陈洁kiki宠粉节狂欢夜观看破千万!四年磨一剑将宠粉做到极致
- 1002. 写出这个数 (20)练习
- vCenter Server CA证书下载
- E-R图画法解析----概念模型的一种表示方法
- 国际物联网展亮相中国苏州 成功促进产业链交流与合作
- 终于有人把 ZFS 文件系统讲明白了
- 极客日报:日本的首颗 5nm 芯片公布;虾米音乐正式关停;网易云音乐再次喊话酷狗...
- 地信、遥感专业各类官网收集(持续更新)
- 开源免费erp ,erp5和odoo的对比
- 蓝牙耳机链接电脑(windows)莫名奇妙关机问题/老是关机问题
- 【智能优化算法】基于凌日算法求解单目标优化问题附matlab代码Transit Search Optimization Algorithm
- 搭建Vue版Ant Design Pro后台管理系统
热门文章
- spring mvc请求的时候是如何找到正确的Controller
- Hibernate概述
- Deepin 系统下安装VMware并激活
- 桥接网络,nat网络,静态IP配置,相关命令
- 【李宏毅2020 ML/DL】补充:Ensemble: Bagging, Boosting, Adaboost, Gradient Boosting, Stacking
- 【数据结构笔记23】C实现:表示图的多种方法(邻接矩阵、邻接表与相关拓展)
- root用户重置其他密码
- 开发打开设置洁面_用了两到三年的华为手机,一键打开开发者选项,帮助性能加速...
- mysql库垂按照模块_前任都能看懂的分库分表方案
- 关于vmware中的centos无法ping通宿主机或者是外网的解决思路