MySQL(第四篇)—數據的完整性約束(1)(實體完整性、域完整性)

數據的完整性約束

一、實體完整性

實體完整性對關係中記錄進行約束,對行的約束。

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、自動增長列

  1. 添加自動增長列
    需要注意,自動增長列必須是主鍵的一部分

在已經創建的數據表中添加

語法格式

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)
  1. 刪除自動增長列
    (實際爲修改,看語法格式也可以看出)

語法格式

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 並不起作用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章