第一:完整性约束介绍

  为了防止不符合规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,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. Hbase 元数据一致性检查(转)

    最近在学习HBase先关的知识,顺便做一下笔记,以加深知识的了解和掌握. Hbase常用工具 文件检测修复工具 hbase hbck -help 常用选项: -details 显示所有region检查 ...

  2. ACM-ICPC 2018 徐州赛区网络预赛 A Hard to prepare(递推)

    https://nanti.jisuanke.com/t/31453 题目 有n个格子拉成一个环,给你k,你能使用任意个数的0 ~ 2^k - 1,规定操作 i XNOR j 为~(i  ^  j), ...

  3. 第八节:Task的各类Task<TResult>返回值以及通用线程的异常处理方案。

    一. Task的各种返回值-Task<TResult> PS: 在前面章节,我们介绍了Task类开启线程.线程等待.线程延续的方式,但我们并没有关注这些方式的返回值,其实他们都是有返回值的 ...

  4. [Luogu P1144]最短路计数

    emmmm这个题看起来非常复杂,实际上仔细一分析发现到一个点最短路的个数就是所有前驱最短路个数之和.如果在图上表示也就是以1为根的bfs搜索树,一个点的最短路个数等于每一个能够向它扩展的所有点的最短路 ...

  5. burp Suite 模块Authz 使用方法

    这个模块是朋友告诉我的,然后进行了研究使用方法. 以下为个人理解,如有错误感谢各位纠正. 0x00 安装Authz Extender > BApp Store > Authz > i ...

  6. sed 使用行号与关键字匹配限定行范围

    1.打印匹配数字4 到最后一行 [111 sed]$ cat input [111 sed]$ sed -n '/4/,$p' input

  7. Centos6.X搭建Squid为YUM做代理

    1.在能联网的机器上安装 Squid yum install squid 2.配置squid vi /etc/squid/squid.conf 编辑内容如下: http_port cache_mem ...

  8. 【原创】Linux基础之挂载硬盘

    1 查看哪些硬盘没有挂载 # fdisk -l Disk /dev/vdb: 107.4 GB, 107374182400 bytes, 209715200 sectorsUnits = sector ...

  9. 【原创】运维基础之yum离线环境安装软件

    首先查看系统版本号,然后根据版本号从 CentOS-7-x86_64-DVD-1708.iso 和 CentOS-7-x86_64-Everything-1708.iso 根据需要选择一个下载,我这里 ...

  10. C++入门篇二

    c++是c语言的增强版,但是和c语言之间有何区别呢? c和c++的区别: 1.全局变量检测增强int a;int a=10; 2.函数检测增强,参数类型增强,返回值检测增强,函数调用参数检测增强(参数 ...