第一:完整性约束介绍

  为了防止不符合规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能写入数据库,以确保数据库中存储的数据正确性,有效性

第二:not null 和 default

是否为空,null 表示为空,非字符串

null:空    not null :非空

默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值
create table tb1(
nid int not null defalut 2,
num int not null
)

示例一:空与非空

这里需要注意的,如果有数据的话,是不能进行修改的

示例二:default

==================default====================
#设置id字段有默认值后,则无论id字段是null还是not null,都可以插入空,插入空默认填入default指定的默认值
mysql> create table tb3(id int default );
mysql> alter table tb3 modify id int not null default ;

default

第三:unique

unique:唯一约束

,设置列级约束:
mysql> create table part1(
-> id int,
-> name varchar() unique
-> );
Query OK, rows affected (0.02 sec) ,设置表级约束:
mysql> create table part2(
-> id int,
-> name varchar(),
-> constraint uk_name unique(name)
-> );
Query OK, rows affected (0.03 sec) 检测约束: mysql> insert into part2 values(,'IT');
Query OK, row affected (0.01 sec) mysql> insert into part2 values(,'IT');
ERROR (): Duplicate entry 'IT' for key 'uk_name'
mysql> add关键字增加唯一约束:
mysql> alter table part1 add unique(id,name);
Query OK, rows affected (0.03 sec)
Records: Duplicates: Warnings: modify关键字删除或者增加唯一约束
mysql> alter table part1 modify id varchar() not null;
Query OK, rows affected (0.05 sec)
Records: Duplicates: Warnings: mysql> alter table part1 modify id varchar() not null unique;
Query OK, rows affected (0.03 sec)
Records: Duplicates: Warnings:
create table service(
id int primary key auto_increment,
name varchar(),
host varchar() not null,
port int not null,
unique(host,port) #联合唯一或关键字唯一
); mysql> insert into service values
-> (,'nginx','1.1.1.1',),
-> (,'haproxy','2.2.2.2',),
-> (,'mysql','3.3.3.3',)
-> ;
Query OK, rows affected (0.01 sec)
Records: Duplicates: Warnings: mysql> insert into service(name,host,port) values('nginx','1.1.1.1',);
ERROR (): Duplicate entry '192.168.0.10-80' for key 'host'

联合唯一

第四:primary key

primary key:主键

#主键约束相当于非空约束和唯一约束。

#每个表只允许拥有一个主键,但是这个主键可以由一个数据或者多个数据列组成,这些列组合不能重复

#标准SQL允许给主键自行命名,但是对于Mysql来说自己的名字没有任何作用,总是默认名为PRIMARY

第一:not null+unique作为主键

mysql> create table part3(
-> id int not null unique,----》主键
-> name varchar() not null unique
-> );
Query OK, rows affected (0.04 sec) mysql> desc part3;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int() | NO | PRI | NULL | |
| name | varchar() | NO | UNI | NULL | |
+-------+-------------+------+-----+---------+-------+
rows in set (0.01 sec) 第二:在其中一个字段后用primary key
mysql> create table part4(
-> id int primary key,----》主键
-> name varchar()
-> );
Query OK, rows affected (0.02 sec) mysql> desc part4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int() | NO | PRI | NULL | |
| name | varchar() | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
rows in set (0.00 sec) 第三:在所有字段后单独定义primary key
mysql> create table part5(
-> id int,
-> name varchar(),
-> constraint pk_name primary key(id)); 创建主键并为其命名pk_name
Query OK, rows affected (0.02 sec) mysql> desc part5;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int() | NO | PRI | NULL | |
| name | varchar() | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
rows in set (0.00 sec) 多列做主键: mysql> create table service(
-> ipaddr varchar(),
-> port char(),
-> service_name varchar() not null,
-> primary key(ipaddr,port)
-> );
Query OK, rows affected (0.02 sec) mysql> insert into service values
-> ('1.1.1.1','','mysqld'),
-> ('2.2.2.2','','nginx')
-> ;
Query OK, rows affected (0.01 sec)
Records: Duplicates: Warnings: mysql> insert into service values ('2.2.2.2','','apache');
ERROR (): Duplicate entry '2.2.2.2-80' for key 'PRIMARY'
mysql>

第五:auto_increment

  1. #主键列自增长特性:如果某个数据列的类型是整型,而且该列作为主键列,则可指定该列具有自增长功能
  2. #mysql使用auto_increment来设置自增长,向该表插入记录时可不为该列指定值,由系统生成
#不指定id,则自动增长
mysql> create table tb5(
-> id int primary key auto_increment,
-> name varchar(),
-> sex enum('man','woman') default 'man'
-> );
Query OK, rows affected (0.02 sec) mysql> desc tb5;
+-------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+----------------+
| id | int() | NO | PRI | NULL | auto_increment |
| name | varchar() | YES | | NULL | |
| sex | enum('man','woman') | YES | | man | |
+-------+---------------------+------+-----+---------+----------------+
rows in set (0.00 sec) mysql> insert into tb5(name) values('zzl'),('zl');
Query OK, rows affected (0.00 sec)
Records: Duplicates: Warnings: mysql> select * from tb5;
+----+------+------+
| id | name | sex |
+----+------+------+
| | zzl | man |
| | zl | man |
+----+------+------+
rows in set (0.00 sec) #指定id
mysql> insert into tb5 values(,'cyy','woman');
Query OK, row affected (0.00 sec) mysql> insert into tb5 values(,'cy','woman');
Query OK, row affected (0.00 sec) mysql> select * from tb5;
+----+------+-------+
| id | name | sex |
+----+------+-------+
| | zzl | man |
| | zl | man |
| | cyy | woman |
| | cy | woman |
+----+------+-------+
rows in set (0.00 sec) #对于自增的字段,在用delete删除后,再插入值,该字段仍按照删除前的位置继续增长
mysql> delete from tb5;
Query OK, rows affected (0.01 sec) mysql> select * from tb5;
Empty set (0.00 sec) mysql> insert into tb5(name) values('zyc');
Query OK, row affected (0.00 sec) mysql> select * from tb5;
+----+------+------+
| id | name | sex |
+----+------+------+
| | zyc | man |
+----+------+------+
row in set (0.00 sec) #应该用truncate清空表,比起delete一条一条地删除记录,truncate是直接清空表,在删除大表时用它
mysql> truncate tb5;
Query OK, rows affected (0.01 sec) mysql> select * from tb5;
Empty set (0.00 sec) mysql> insert into tb5(name) values('zzl');
Query OK, row affected (0.33 sec) mysql> select * from tb5;
+----+------+------+
| id | name | sex |
+----+------+------+
| | zzl | man |
+----+------+------+
row in set (0.00 sec)

第六:foreign key

通过下面的例子理解下foreign key(外键)

我们完全可以定义一个班级表

然后让学生表关联该表,关联方法即foreign key

eg:

#表类型必须是innodb存储引擎,且被关联的字段,即references指定的另外一个表的字段,必须保证唯一
create table class(
cid int primary key,
name varchar() not null
)engine=innodb; #class_id外键,关联父表(class主键cid),同步更新,同步删除
create table student(
sid int primary key,
name varchar() not null,
class_id int,
constraint fk_name foreign key(class_id)
references class(cid)
on delete cascade
on update cascade
)engine=innodb; #先往父表department中插入记录
insert into class values
(,'一年级一班'),
(,'二年级三班'),
(,'三年级四班'); #再往子表student中插入记录
insert into student values
(,'张三',),
(,'张四',),
(,'小明',),
(,'小王',),
(,'小李',),
(,'王强',),
(,'小程',),
(,'小红',),
(,'王五',),
(,'小军',)
; #删父表class,子表student中对应的记录跟着删
mysql> delete from class where cid=;
mysql> select * from student;
+----+-------+----------+
|sid | name | class_id |
+----+-------+----------+
| | 张三 | |
| | 小明 | |
| | 小王 | |
| | 小红 | |
| | 王五 | |
+----+-------+----------+ #更新父表class,子表student中对应的记录跟着改
mysql> update class set cid= where cid=;
mysql> select * from student;
+----+-------+----------+
|sid | name | class_id |
+----+-------+----------+
| | 张三 | |
| | 小明 | |
| | 小王 | |
| | 小红 | |
| | 王五 | |
+----+-------+----------+

找表中的关系:

分析步骤:
#、先站在左表的角度去找
是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id) #、再站在右表的角度去找
是否右表的多条记录可以对应左表的一条记录,如果是,则证明右表的一个字段foreign key 左表一个字段(通常是id) #、总结:
#多对一:
如果只有步骤1成立,则是左表多对一右表
如果只有步骤2成立,则是右表多对一左表 #多对多
如果步骤1和2同时成立,则证明这两张表时一个双向的多对一,即多对多,需要定义一个这两张表的关系表来专门存放二者的关系 #一对一:
如果1和2都不成立,而是左表的一条记录唯一对应右表的一条记录,反之亦然。这种情况很简单,就是在左表foreign key右表的基础上,将左表的外键字段设置成unique即可

找关系

最后介绍三种对应的关系:

一对一

两张表:用户表和客户表
一对一:一个用户是一个客户,一个客户有可能变成一个用户,即一对一的关系
关联方式:foreign key+unique

#一定是user来foreign key表customer,这样就保证了:
# 用户一定是一个客户,
# 客户不一定是用户,但有可能成为一个用户 create table customer(
id int primary key auto_increment,
name varchar() not null,
phone char() not null
); create table user(
id int primary key auto_increment,
user_name varchar() not null,
customer_id int unique, #该字段一定要是唯一的
foreign key(customer_id) references customer(id) #外键的字段一定要保证unique
on delete cascade
on update cascade
); #增加客户
insert into customer(name,phone) values
('张三',),
('李四',),
('王五',),
('赵六',),
('周八,13721799962),
('蒋二',)
; #增加学生
insert into student(user_name,customer_id) values
('季度用户',),
('月用户',),
('月用户',)
;
多对一(一对多):

见上面例子中的学生与班级

多对多:

用户权限关系:

一个用户可以有多个权限

一个权限可以供多个用户拥有

mysql> create table userinfo(
-> nid int primary key auto_increment,
-> name varchar(),
-> password varchar());
Query OK, rows affected (0.04 sec) mysql> create table permission(
-> nid int primary key auto_increment,
-> caption varchar()
-> );
Query OK, rows affected (0.02 sec) mysql> create table user_to_permission(
-> nid int not null unique auto_increment,
-> user_id int not null,
-> permission_id int not null,
-> constraint fk_user foreign key(user_id) references userinfo(nid)
-> on delete cascade
-> on update cascade,
-> constraint fk_permission foreign key(permission_id) references permission(nid)
-> on delete cascade
-> on update cascade,
-> primary key(user_id,permission_id)
-> );
Query OK, rows affected (0.03 sec) mysql> insert into userinfo(name,password) values('root','');
Query OK, row affected (0.01 sec) mysql> insert into userinfo(name,password) values('alex','');
Query OK, row affected (0.00 sec) mysql> insert into userinfo(name,password) values('eric','');
Query OK, row affected (0.01 sec) mysql> insert into permission(caption) values('add user'),('delete user'),('select user')
-> ;
Query OK, rows affected (0.01 sec)
Records: Duplicates: Warnings: mysql> select * from userinfo;
+-----+------+----------+
| nid | name | password |
+-----+------+----------+
| | root | |
| | alex | |
| | eric | |
+-----+------+----------+
rows in set (0.01 sec) mysql> select * from permission;
+-----+-------------+
| nid | caption |
+-----+-------------+
| | add user |
| | delete user |
| | select user |
+-----+-------------+
rows in set (0.00 sec) mysql> insert into user_to_permission(user_id,permission_id) values(,),(,),(,),(,),(,)
-> ;
Query OK, rows affected (0.01 sec)
Records: Duplicates: Warnings: mysql> select * from user_to_permission;
+-----+---------+---------------+
| nid | user_id | permission_id |
+-----+---------+---------------+
| | | |
| | | |
| | | |
| | | |
| | | |
+-----+---------+---------------+
rows in set (0.01 sec) mysql>

mysql完整性约束的更多相关文章

  1. mysql 完整性约束

    mysql 完整性约束 数据的完整性概述根据完整性实施的方法将完整性约束分为四类:1.实体完整性 实体完整性的实现:通过在表中设置主键约束.唯一约束或标识列来实现 主键约束:应用于表列的一个约束 用法 ...

  2. {MySQL完整性约束}一 介绍 二 not null与default 三 unique 四 primary key 五 auto_increment 六 foreign key 七 作业

    MySQL完整性约束 阅读目录 一 介绍 二 not null与default 三 unique 四 primary key 五 auto_increment 六 foreign key 七 作业 一 ...

  3. MySQL完整性约束foreign key与表操作。

    一  MySQL中表的完整性约束: 我们首先知道约束条件跟类型的宽度一样,都是可选的,也就是说,我们在创建表的时候可以不指定,但是为了创建的表更加的完整,我们一般会加一些约束条件,name下面我们讲一 ...

  4. SQL学习笔记三(补充-3)之MySQL完整性约束

    阅读目录 一 介绍 二 not null与default 三 unique 四 primary key 五 auto_increment 六 foreign key 七 作业 一 介绍 约束条件与数据 ...

  5. mysql数据库从删库到跑路之mysql完整性约束

    一 介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY ...

  6. 数据库——MySQL——完整性约束

    约束,就是用来保证数据完整性和一致性的. 常见的约束分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY (FK) 标识该字段为该表的外键 NO ...

  7. 百万年薪python之路 -- MySQL数据库之 完整性约束

    MySQL完整性约束 一. 介绍 为了防止不符合规范的数据进入数据库,在用户对数据进行插入.修改.删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数 ...

  8. python之路--MySQL 库,表的详细操作

    一 库操作 数据库命名规则 可以由数字,字母,下划线,@, #, $ 区分大小写 唯一性 不能使用关键字如 create  select 不能单独使用数字 最长128位 # 这些是对上次的补充. 二 ...

  9. python全栈开发day54-mysql库操作、表操作、数据类型、完整性约束

    一.昨日内容回顾 1.mysql的安装 1).解压文件 添加环境变量bin 2).初始化mysql生成数据data文件夹: mysqld --initialize-insecure 3).mysqld ...

随机推荐

  1. kubernetes云平台管理实战: 滚动升级秒级回滚(六)

    一.nginx保证有两个版本 1.查看当前容器运行nginx版本 [root@k8s-master ~]# kubectl get pod -o wide NAME READY STATUS REST ...

  2. Docker:单机编排工具docker-compose [十二]

    一.docker-compose的安装 1.安装 curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.re ...

  3. 关于中国菜刀,如何"切菜"

    介绍 经典标题党,中国菜刀有大牛已经分析过了->传送门(http://blog.csdn.net/p656456564545/article/details/49671829).博主PHP刚接触 ...

  4. mysql-8.0.11安装步骤

    1.下载好安装包:mysql-8.0.11-winx64.zip 2.解压到合适的目录,例如:C:\XQ\Soft\mysql-8.0.11-winx64 3.在目录下创建my.ini文件,配置bas ...

  5. php 两变量值互换 方法

    //方法一:$a ="abc";$b="def"; $a = $a^$b;$b = $b^$a;$a = $a^$b; //方法二:list($a, $b)= ...

  6. liunx 下WebBench 安装与压力测试

    安装: wget http://blog.zyan.cc/soft/linux/webbench/webbench-1.5.tar.gz tar zxvf webbench-1.5.tar.gz cd ...

  7. jsp 部署

    部署一个Servlet 3.0应用程序是一件轻而易举的 事.通过Servlet注解类型,对于不太复杂的应用程序, 可以部署没有描述符的Servlet/JSP应用程序.尽管如 此,在需要更加精细配置的情 ...

  8. jQuery 第六章 jQuery在Ajax应用

    1.本章目标 ajax 2.ajax 异步刷新技术,我们的网页不需要全部刷新,按需实现局部刷新,上线后台的交互 用户体验好 地图,前台验证,表单提交,修改,查询等等 原生的js和ajax packag ...

  9. 基于netty的socket服务端触发了channelInactive方法,但实际连接没有断开的问题

    背景: 一个中小型H5游戏,后端使用基于 netty 的socket服务 服务端 分为 分发服务器 & 业务服务器,业务服务器可负载 用户客户端与分发服务器连接 分发服务器再作为客户端与每台业 ...

  10. NOIP2018普及初赛解析

    2018年第二十四届全国青少年信息学奥林匹克联赛初赛普及组真题解析 一.单项选择题 1. 以下哪一种设备属于输出设备:(D) A.扫描仪 _B.键盘C. 鼠标 _D. 打印机 解析:送分题,前三个都是 ...