第一:完整性约束介绍

  为了防止不符合规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,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. NOI-OJ 2.2 ID:8758 2的幂次方表示

    思路 可以把任意一个数转化为2^a+2^b+2^c+...+2^n 例如137的二进制为10001001,这就等效于2^7+2^3+2^0 以上结果如何通过程序循环处理呢?需要把数字n分解为上述公式, ...

  2. Git——如何将本地项目提交至远程仓库(第一次)

    1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库. git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数 ...

  3. sublime text3格式化html,css,js代码

    需要安装HTML/CSS/JS prettify插件. 安装步骤:首选项 -> Package Control -> Install Package -> HTML-CSS-JS P ...

  4. Codeforces Round #527 (Div. 3) . F Tree with Maximum Cost

    题目链接 题意:给你一棵树,让你找一个顶点iii,使得这个点的∑dis(i,j)∗a[j]\sum dis(i,j)*a[j]∑dis(i,j)∗a[j]最大.dis(i,j)dis(i,j)dis( ...

  5. 移动端click事件300ms延迟

    移动端click 事件延迟300ms 一般情况下,如果没有经过特殊处理,移动端浏览器在派发点击事件的时候,通常会出现300ms左右的延迟.也就是说,当我们点击页面的时候移动端浏览器并不是立即作出反应, ...

  6. (四)Java工程化--Git基础

    GIT学习参考:https://git-scm.com/book/zh/v2 常见命令 git init 初始化项目 git add *.java 添加文件到git版本控制(.java后缀的全部文件) ...

  7. zookeep服务启动命令

    zookeeper的安装目录:/usr/local/zookeeper-3.4.6/bin/zkServer.sh; 配置文件路径:../conf/zoo.cfg 端口 :2181: ZooKeepe ...

  8. 在Linux中调试段错误(core dumped)

    在Linux中调试段错误(core dumped) 在作比赛的时候经常遇到段错误, 但是一般都采用的是printf打印信息这种笨方法,而且定位bug比较慢,今天尝试利用gdb工具调试段错误. 段错误( ...

  9. 【原创】大叔问题定位分享(13)HBase Region频繁下线

    问题现象:hive执行sql报错 select count(*) from test_hive_table; 报错 Error: java.io.IOException: org.apache.had ...

  10. 2019 Android 高级面试题总结 从java语言到AIDL使用与原理

    说下你所知道的设计模式与使用场景 a.建造者模式: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 使用场景比如最常见的AlertDialog,拿我们开发过程中举例,比如C ...