第一:完整性约束介绍

  为了防止不符合规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,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. ArcGis Classic COM Add-Ins插件开发的一般流程 C#

    COM add-ins是我对这种开发方式的称呼,Esri的官方文档里称其为“Extending ArcObject”或者“Classic COM extensibility”,Esri所称的addin ...

  2. 前端面试题整理—Vue篇

     1.对vue的理解,有什么特点,vue为什么不能兼容IE8及以下浏览器 vue是一套用于构建用户界面的渐进式框架,核心是一个响应的数据绑定系统 vue是一款MVVM框架,基于双向绑定数据,当数据发生 ...

  3. mysql/mariadb主从复制

    主从复制简介 MySQL数据库的主从复制方案,是其自带的功能,并且主从复制并不是复制磁盘上的数据库文件,而是通过binlog日志复制到需要同步的从服务器上. MySQL数据库支持单向.双向.链式级联, ...

  4. EffectiveC++ 第5章 实现

    我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」. Chapter 5 实现 Implementations 适当提出属于 ...

  5. springMVC工作过程

    学习springmvc之前先学习一下他的工作过程 如图 1.用户通过客户端向服务器发送请求,请求会被springMVC的前端控制器DispatchServlet所拦截. 2.DispatchServl ...

  6. 《Java编程思想第四版完整中文高清版.pdf》-笔记

    D.2.1 安插自己的测试代码 插入下述“显式”计时代码,对程序进行评测: long start = System.currentTimeMillis(); // 要计时的运算代码放在这儿 long ...

  7. undefined reference to symbol 'pthread_create@@GLIBC_2.2.5' 的修改方法

    在编译DSO代码的时候会如下这样的问题: 检查DSO,在程序中没有用到pthread,但是在编译的时候却出现此类问题.仔细想了想了一下,在程序中用到了C++11中的线程std::thread,个人猜测 ...

  8. localhost和127.0.0.1的区别

    localhost(local)是不经网卡传输,它不受网络防火墙和网卡相关的的限制. 127.0.0.1是通过网卡传输,依赖网卡,并受到网络防火墙和网卡相关的限制. ::1     是IPv6中的12 ...

  9. Web从入门到放弃<3>

    UI简单的美化全部来源于Bootstrap 知识来自<javascript dom编程艺术第二版> <1> 点击列表 页面不跳转图片刷新:  主要点: href如何点击完如何不 ...

  10. webpack dev-server 允许移动端调试

    "dev": "cross-env NODE_ENV=development webpack-dev-server --host 0.0.0.0 --open --hot ...