一、概述

为了约束用户对数据增,删,改,以确保数据正确,有效,合规。

有以下几种约束

  • not null 非空 指定某列不能为空
  • unique 唯一 指定某列或某几列的组合不能重复
  • primary key 主键 指定某列的值可以唯一标识该列记录
  • foreign key 外键 指定该行记录从属于主表的某条记录,主要用于参照完整性

二、not null

  • null 某列可以为空
  • not null 某列不可以为空

2.1 实例1

mysql> create table t2(id int not null) engine=innodb default charset = utf8;
Query OK, 0 rows affected (0.00 sec) mysql> desc t2;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec) mysql> insert into t2(id) values(2);
Query OK, 1 row affected (0.01 sec) mysql> select * from t2;
+----+
| id |
+----+
| 2 |
+----+
1 row in set (0.00 sec)
# 插入空值会报错
mysql> insert into t2(id) values(null);
ERROR 1048 (23000): Column 'id' cannot be null

2.2 与default 混用

mysql> create table t3(id1 int not null,id2 int not null default 10)engine = innodb default charset = utf8;
Query OK, 0 rows affected (0.00 sec) mysql> desc t3;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id1 | int(11) | NO | | NULL | |
| id2 | int(11) | NO | | 10 | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

# 如果不指定默认列值,则使用默认值
mysql> insert into t3(id1) values(1);
Query OK, 1 row affected (0.01 sec) mysql> select * from t3;
+-----+-----+
| id1 | id2 |
+-----+-----+
| 1 | 10 |
+-----+-----+
1 row in set (0.00 sec)

# 向默认值列插入数据,新数据会覆盖默认数据
mysql> insert into t3(id1,id2) values(12,12);
Query OK, 1 row affected (0.00 sec) mysql> select * from t3;
+-----+-----+
| id1 | id2 |
+-----+-----+
| 1 | 10 |
| 12 | 12 |
+-----+-----+

三、unique

指定某列或某几列不能重复

3.1 创建唯一索引的两种方式

# 方法1
mysql> create table userinfo1(
-> id int auto_increment primary key,
-> name varchar(20) not null unique,
-> password varchar(100) not null)
-> engine = innodb default charset = utf8;
Query OK, 0 rows affected (0.01 sec) mysql> desc userinfo1
-> ;
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | UNI | NULL | |
| password | varchar(100) | NO | | NULL | |

方法2:

mysql> create table userinfo2(
-> id int auto_increment primary key,
-> name varchar(20),
-> password varchar(100),
-> unique(name))
-> engine = innodb default charset = utf8;
Query OK, 0 rows affected (0.01 sec) mysql> desc userinfo2;
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | UNI | NULL | |
| password | varchar(100) | YES | | NULL | |
+----------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> desc userinfo2;
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | UNI | NULL | |
| password | varchar(100) | YES | | NULL | |
+----------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

# 向唯一索引所在的列进行插入数据时,如果数据相同,则会报错

mysql> insert into userinfo2(name,password) values('wangys','123');
Query OK, 1 row affected (0.00 sec)

mysql> insert into userinfo2(name,password) values('wangys','123');
ERROR 1062 (23000): Duplicate entry 'wangys' for key 'name'

3.2 联合唯一索引

多列的组合唯一

mysql> create table service(
-> id int auto_increment primary key ,
-> name varchar(20) not null,
-> host varchar(32) not null,
-> port int not null,
-> unique(host,port))
-> engine = innodb default charset = utf8;
Query OK, 0 rows affected (0.01 sec) mysql> desc service;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| host | varchar(32) | NO | MUL | NULL | |
| port | int(11) | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec) mysql> insert into service(name,host,port) values('nginx','1.1.1.1',80);
Query OK, 1 row affected (0.00 sec) mysql> insert into service(name,host,port) values('nginx','1.1.1.1',80);
ERROR 1062 (23000): Duplicate entry '1.1.1.1-80' for key 'host'
mysql> insert into service(name,host,port) values('nginx','1.1.1.1',90);
Query OK, 1 row affected (0.00 sec)

四、primary key

  • 唯一值
  • 非空
  • 可以为一列,也可以为多列(联合主键)
  • 可以再创建表时创建,也可以基于已创建的表进行增加

4.1 创建主键的方法

第一种

mysql> create table userinfo(
-> id int auto_increment primary key,
-> name varchar(20))
-> engine = innodb default charset = utf8;
Query OK, 0 rows affected (0.09 sec) mysql> desc userinfo
-> ;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

第二种

mysql> create table userinfo2(
-> id int auto_increment,
-> name varchar(20),
-> primary key(id))
-> engine = innodb default charset = utf8;
Query OK, 0 rows affected (0.01 sec) mysql> desc userinfo2;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)

第三种 修改

mysql> create table userinfo3( id int, name varchar(20)) engine = innodb default charset = utf8;
Query OK, 0 rows affected (0.01 sec) mysql> alter table userinfo3 modify id int auto_increment primary key ;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> desc userinfo3;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

第四种  联合主键

mysql> create table services(
-> name varchar(20),
-> host varchar(32),
-> port int,
-> primary key(host,port))
-> engine = innodb default charset=utf8;
Query OK, 0 rows affected (0.00 sec) mysql> desc services;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| host | varchar(32) | NO | PRI | | |
| port | int(11) | NO | PRI | 0 | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec) mysql> insert into services(name,host,port) values('nginx','1.1.1.1',80);
Query OK, 1 row affected (0.00 sec) mysql> insert into services(name,host,port) values('nginx','1.1.1.1',90);
Query OK, 1 row affected (0.00 sec) mysql> insert into services(name,host,port) values('nginx','1.1.1.1',90);
ERROR 1062 (23000): Duplicate entry '1.1.1.1-90' for key 'PRIMARY'

4.2 auto_increment

约束字段为自动增长,被约束的字段必须同时被key约束

mysql> create table userinfo4(
-> id int primary key auto_increment,
-> name varchar(20))
-> engine = innodb default charset = utf8;
Query OK, 0 rows affected (0.00 sec) mysql> desc userinfo4;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec) mysql> insert into userinfo4(name) values('wangys');
Query OK, 1 row affected (0.00 sec) mysql> select * from userinfo4;
+----+--------+
| id | name |
+----+--------+
| 1 | wangys |
+----+--------+
1 row in set (0.00 sec) # 也可以直接指定id值
mysql> insert into userinfo4(id,name) values(4,'wangys');
Query OK, 1 row affected (0.00 sec) mysql> select * from userinfo4;
+----+--------+
| id | name |
+----+--------+
| 1 | wangys |
| 4 | wangys |
+----+--------+

五、外键

  • 被关联的字段必须有唯一约束,且为innodb表
# 创建一个部门表
mysql> create table departments(
-> id int auto_increment primary key,
-> name varchar(25) not null)
-> engine = innodb default charset = utf8;
Query OK, 0 rows affected (0.00 sec) mysql> desc departments;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(25) | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
# 创建一个员工表dpt_id是外键,主表是部门表,关联id列
mysql> create table employee(
-> id int auto_increment primary key,
-> name varchar(25) not null,
-> dpt_id int,
-> foreign key(dpt_id)
-> references departments(id)
-> on delete cascade
-> on update cascade)
-> engine = innodb default charset = utf8;
Query OK, 0 rows affected (0.00 sec) mysql> desc employee;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(25) | NO | | NULL | |
| dpt_id | int(11) | YES | MUL | NULL | |
+--------+-------------+------+-----+---------+----------------+
# 删除主表某一行,则自动删除员工表关联的数据
mysql> select * from departments;
+----+--------+
| id | name |
+----+--------+
| 1 | 产品 |
| 2 | 技术 |
| 3 | 销售 |
+----+--------+
3 rows in set (0.00 sec) mysql> select * from employee;
+----+--------+--------+
| id | name | dpt_id |
+----+--------+--------+
| 1 | 老王 | 2 |
| 3 | 老搜 | 3 |
| 4 | 老郭 | 1 |
+----+--------+--------+
3 rows in set (0.00 sec) mysql> delete from departments where name ='产品';
Query OK, 1 row affected (0.00 sec) mysql> select * from departments;
+----+--------+
| id | name |
+----+--------+
| 2 | 技术 |
| 3 | 销售 |
+----+--------+
2 rows in set (0.00 sec) mysql> select * from employee;
+----+--------+--------+
| id | name | dpt_id |
+----+--------+--------+
| 1 | 老王 | 2 |
| 3 | 老搜 | 3 |
+----+--------+--------+
2 rows in set (0.00 sec)

Mysql-表的完整性约束的更多相关文章

  1. 三.mysql表的完整性约束

    mysql表的完整性约束 什么是约束 not null    不能为空的 unique      唯一 = 不能重复 primary key 主键 = 不能为空 且 不能重复 foreign key ...

  2. mysql表的完整性约束

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

  3. day--38 mysql表的完整性约束总结

    表的简单查询参考:https://www.cnblogs.com/clschao/articles/9995531.html 一:单表的查询: 查询数据的本质:mysql会去本地的硬盘上面找到对应的文 ...

  4. MySQL表完整性约束

    =======MySQL表完整性约束====== 目录: 一.介绍 二.not null 与 default 三.unique 四.primary key 五.auto_increment 六.for ...

  5. Mysql表基本操作

    一. 创建表的方法 语法:create table 表名( 属性名数据类型完整约束条件, 属性名数据类型条完整约束件, ......... 属性名数据类型 ); (1)举例:1 create tabl ...

  6. MySQL表设计基础

    MySQL表设计关于blog数据库中建立所有表的sql语句<一.>sql语句中 约束概念constraint concept1.1 实体完整性entity integrity(主键--唯一 ...

  7. MySQL中的完整性约束

    对于已经创建好的表,虽然字段的数据类型决定所能存储的数据类型,但是表中所存储的数据是否合法并没有检查. MySQL支持的完整性约束: NOT NULL                 约束字段的值不能 ...

  8. 数据库 -- mysql表操作

    一,存储引擎介绍 存储引擎即表类型,mysql根据不同的表类型会有不同的处理机制 详见:https://www.cnblogs.com/peng104/p/9751738.html 二,表介绍 表相当 ...

  9. day36 mysql 表的具体操作

    一    库操作 1.创建数据库 1.1 语法 CREATE DATABASE 数据库名 charset utf8; 1.2 数据库命名规则 可以由字母.数字.下划线.@.#.$ 区分大小写 唯一性 ...

  10. Mysql数据库(三)Mysql表结构管理

    一.MySQL数据类型 1.数字类型 (1)整数数据类型包括TINYINT/BIT/BOOL/SMALLINT/MEDIUMINT/INT/BIGINT (2)浮点数据类型包括FLOAT/DOUBLE ...

随机推荐

  1. ubuntu14.04按照mysql5.7

    1.安装mysql5.5 https://www.cnblogs.com/zhuyp1015/p/3561470.html https://www.cnblogs.com/ruofengzhishan ...

  2. ADO.Net笔记整理(一)

    几次装机,Notes已烟消云散,近日因为Node.js死活搞不定,无奈装机,备份好的东东,没想到磁盘扇区出现异常,可能是PE启动盘的病毒,只好将磁盘全部重新分区,恢复数据也懒得恢复了,日积月累关乎将来 ...

  3. docker上传自己的镜像

    https://blog.csdn.net/boonya/article/details/74906927 需要注意的就是命名规范 docker push 注册用户名/镜像名

  4. 数组的处理方法,filter的用法

    在数组的使用中,我们通常会有数组的过滤的需求,比如值 在某个范围内的数字,用来组成一个新的数组,这就用到了数组的过滤 例: var number=[23,3,51,65,13,45,65,23,63] ...

  5. qt 视频播放器错误解决方法

    DirectShowPlayerService::doRender: Unresolved error code 0x80040266 () 当你发布的qmlproject包含QtMultimedia ...

  6. .NET常用开发框架汇总

    分布式缓存框架:Microsoft Velocity:微软自家分布式缓存服务框架.Memcahed:一套分布式的高速缓存系统,目前被许多网站使用以提升网站的访问速度.Redis:是一个高性能的KV数据 ...

  7. 野路子码农系列(1) 创建Web API

    新工作正式开始了2天,由于客户暂时还没交接数据过来,暂时无事可做.恰逢政佬给某超市做的商品图像识别的项目客户催收了,老板要求赶紧搞个API,于是我就想我来试试吧. 说起API,我其实是一窍不通的,我对 ...

  8. oldboy s21day15模块装饰器及其他应用

    #!/usr/bin/env python# -*- coding:utf-8 -*- # 1.sys.path.append("/root/mods")的作用?"&qu ...

  9. 关于SVN报错 svn: E170013 E125006: contains invalid filesystem format option 'addressing logical'

    在使用svn的时候,遇到了这样的一个问题 首先我使用TortoiseSVN 右键创建的repository. 之后用IDEA,配置了1.9.4版本的SVN,去commit访问这个仓库 结果出现了以下的 ...

  10. Timer定时方法(间隔时间后执行)

    Timer time = new Timer(); time.schedule(new TimerTask() { @Override public void run() { // TODO Auto ...