數據的完整性約束
一、實體完整性
實體完整性對關係中記錄進行約束,對行的約束。
1、主鍵約束
主鍵用於唯一的標識表中的某一條記錄。
主鍵的值能唯一的標識表中的每一行。
一個表上只能有一個主鍵約束。
所在列不能爲null
(1).添加主鍵約束
在已經創建的表中添加主鍵約束
alter table 表名 add primary key(列名);
示例
我們首先使用desc語句查看一下表結構
mysql> desc stu;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
如上可以看到,id字段沒有key值。
下面開始爲stu表設置主鍵約束,設置id列爲主鍵
mysql> alter table stu add primary key(id);
Query OK, 0 rows affected (0.18 sec)
Records: 0 Duplicates: 0 Warnings: 0
以上結果證明,主鍵添加完成,再查看
mysql> desc stu;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
可以看到,id字段的key值爲PRI,代表主鍵
創建表時添加主鍵約束
create table 表名 ( 字段名 數據類型 primary key,... );
示例,創建student表時,爲student表添加主鍵約束,設置id列爲主鍵
mysql> create table student (
-> id int primary key,
-> name varchar(50),
-> age int,
-> sex varchar(50)
-> );
Query OK, 0 rows affected (0.03 sec)
使用desc語句查看一下
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
可以看到,主鍵添加成功
(2)刪除主鍵約束
alter table 表名 drop primary key;
示例,刪除student表的主鍵約束
mysql> alter table student drop primary key;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
使用desc語句查看,如下,student表的主鍵約束成功刪除
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
(3)新插入數據主鍵重複和主鍵值爲null 的錯誤
新插入數據主鍵重複
剛纔已經爲stu表添加了主鍵約束,如下
mysql> desc stu;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
先來查看一下stu表中的數據
mysql> select * from stu;
+----+----------+------+------+
| id | name | age | sex |
+----+----------+------+------+
| 1 | xiaohong | 18 | nv |
+----+----------+------+------+
1 row in set (0.00 sec)
嘗試再次插入id爲1的數據
mysql> insert into stu values (1,'xiaolan',19,'nv');
ERROR 1062 (23000): Duplicate entry '1' for key 'stu.PRIMARY'
如上,插入失敗,新插入數據主鍵不能重複
將1改爲2,再次嘗試插入
mysql> insert into stu values (2,'xiaolan',19,'nv');
Query OK, 1 row affected (0.00 sec)
使用select語句查看數據如下,id值不重複時成功插入了
mysql> select * from stu;
+----+----------+------+------+
| id | name | age | sex |
+----+----------+------+------+
| 1 | xiaohong | 18 | nv |
| 2 | xiaolan | 19 | nv |
+----+----------+------+------+
2 rows in set (0.00 sec)
主鍵值爲null
嘗試插入id爲null的數據
mysql> insert into stu values (null,'xiaomin',19,'nv');
ERROR 1048 (23000): Column 'id' cannot be null
mysql> insert into stu values (NULL,'xiaomin',19,'nv');
ERROR 1048 (23000): Column 'id' cannot be null
定義爲主鍵的字段值不能爲null
2、唯一約束
唯一約束用來保證數據表中字段值是唯一的
(1)添加唯一約束
在已經創建的數據表中添加唯一約束
alter table 表名 add unique(列名);
示例
爲name字段添加唯一約束
mysql> alter table student add unique(name);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
使用desc 語句查看,name字段的key值爲UNI, 代表唯一約束
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | | NULL | |
| name | varchar(50) | YES | UNI | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
在創建數據表時添加唯一約束
create table 表名(字段名 數據類型 unique,...);
示例,創建student2表爲字段name設置唯一性約束
mysql> create table student2 (
-> id int,
-> name varchar(50) unique,
-> age int,
-> sex varchar(50)
-> );
Query OK, 0 rows affected (0.02 sec)
使用desc語句查看一下
mysql> desc student2;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(50) | YES | UNI | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
(2)添加重複數據的錯誤
如下,name字段設置有唯一性約束
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | | NULL | |
| name | varchar(50) | YES | UNI | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
我們先來看一下student表內數據
mysql> select * from student;
+----+----------+------+------+
| id | name | age | sex |
+----+----------+------+------+
| 1 | xiaobai | 18 | nan |
| 2 | xiaogang | 19 | nv |
+----+----------+------+------+
2 rows in set (0.00 sec)
嘗試再添加name爲xiaobai的數據
mysql> insert into student values (3,'xiaobai',19,'nan');
ERROR 1062 (23000): Duplicate entry 'xiaobai' for key 'student.name'
插入出錯了,說明唯一性約束起作用了,將‘xiaobai’改爲‘xiaobaibai’,再次嘗試
mysql> insert into student values (3,'xiaobaibai',19,'nan');
Query OK, 1 row affected (0.00 sec)
插入成功了
mysql> select * from student;
+----+------------+------+------+
| id | name | age | sex |
+----+------------+------+------+
| 1 | xiaobai | 18 | nan |
| 2 | xiaogang | 19 | nv |
| 3 | xiaobaibai | 19 | nan |
+----+------------+------+------+
3 rows in set (0.00 sec)
(3) 刪除唯一約束
alter table 表名 drop index 字段名;
示例,刪除student表name字段的唯一性約束
mysql> alter table student drop index name;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
查看一下
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
3、自動增長列
- 添加自動增長列
需要注意,自動增長列必須是主鍵的一部分
在已經創建的數據表中添加
語法格式
alter table 表名 modify 字段名 數據類型 primary key auto_increment;
爲student表id字段設置爲自動增長列
mysql> alter table student modify id int primary key auto_increment;
Query OK, 3 rows affected (0.04 sec)
Records: 3 Duplicates: 0 Warnings: 0
設置後,查看一下
mysql> desc student;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
插入數據的變化
先來看一下,未插入新數據時的表數據
mysql> select * from student;
+----+------------+------+------+
| id | name | age | sex |
+----+------------+------+------+
| 1 | xiaobai | 18 | nan |
| 2 | xiaogang | 19 | nv |
| 3 | xiaobaibai | 19 | nan |
+----+------------+------+------+
3 rows in set (0.00 sec)
插入一條新數據
mysql> insert into student (name,age,sex) values ('xiaohua',17,'nan');
Query OK, 1 row affected (0.00 sec)
查看一下,如下,id自動生產了數值4
mysql> select * from student;
+----+------------+------+------+
| id | name | age | sex |
+----+------------+------+------+
| 1 | xiaobai | 18 | nan |
| 2 | xiaogang | 19 | nv |
| 3 | xiaobaibai | 19 | nan |
| 4 | xiaohua | 17 | nan |
+----+------------+------+------+
4 rows in set (0.00 sec)
在創建數據表時添加
create table 表名(字段名 數據類型 auto_increment,...);
創建表student3,使id字段的值自動增加
mysql> create table student3(
->id int primary key auto_increment,
->name varchar(50),
->age int,sex varchar(20)
->);
Query OK, 0 rows affected (0.03 sec)
使用desc語句查看如下
mysql> desc student3;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
- 刪除自動增長列
(實際爲修改,看語法格式也可以看出)
語法格式
alter table 表名 modify 字段 數據類型;
示例,刪除表student3中id字段的自動增長
mysql> alter table student3 modify id int;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
如下,成功修改
mysql> desc student3;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
二、域完整性
域完整性是對關係中的單元格進行約束,域代表單元格,也就是對列的約束
1、非空約束
用於保證數據表中某個字段的值不爲null
(1)添加非空約束
在已經創建完成的表中添加
alter table 表名 modify 字段名 數據類型 not null;
示例
要給表student3的age字段添加非空約束,先查看一下,如下,age字段的null值顯示爲YES
mysql> desc student3;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
給表student3的age字段添加非空約束
mysql> alter table student3 modify age int not null;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
再次查看,age字段的null值顯示爲NO
mysql> desc student3;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | NO | | NULL | |
| sex | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
以上結果,代表age字段的非空約束添加成功
在創建表時添加
create table 表名 (字段名 數據類型 not null,...);
mysql> create table student4 (
-> id int,
-> name varchar(50),
-> age int not null,
-> sex varchar(20)
-> );
Query OK, 0 rows affected (0.03 sec)
再查看,age字段的null值顯示爲NO,添加成功了
mysql> desc student4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | NO | | NULL | |
| sex | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
(2)刪除(修改)非空約束
alter table 表名 modify 字段名 數據類型;
2、默認值約束
默認值約束用於爲數據表中某個字段添加默認值
在創建表時添加默認值約束
create table 表名(字段名 數據類型 default 默認值,...);
示例
mysql> create table student5(
-> id int,
-> name varchar(50),
-> age int,
-> sex varchar(20) default 'nv'
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> desc student5;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(20) | YES | | nv | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
在已創建完成的表中添加默認值約束
alter table 表名 modify 字段名 數據類型 default 默認值;
爲表student3中sex字段設置默認值“nv”
mysql> alter table student3 modify sex varchar(20) default 'nv';
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
如下,默認值約束添加成功了
mysql> desc student3;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | varchar(20) | YES | | nv | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
3、數據類型
數據類型帶來的約束
(1)數值類型
(2)字符串類型
(3)日期和時間類型等
4、CHECK檢查約束
MySQL 所有的存儲引擎都不支持 CHECK 約束
MySQL中可以寫 CHECK 約束,但MySQL會忽略CHECK約束,因此CHECK 並不起作用