1. 程式人生 > >例題SQL語句詳解-資料庫基本操作9-完整性介紹

例題SQL語句詳解-資料庫基本操作9-完整性介紹

|

1.15 資料完整性介紹 在這裡插入圖片描述

1.15.1 保證實體完整性

1、 主鍵約束

2、 唯一約束

3、 自動增長列

1.15.2 保證域完整性

1、 資料型別約束

2、 非空約束

3、 預設值約束

1.15.3 保證引用完整性

1、外來鍵約束:從表中的公共欄位是主表的外來鍵

1.16 引用完整性

1.16.1 主表和從表

兩個表建立關係(兩個表只要有公共欄位就有關係),一個表稱為主表,一個表稱為從表。

外來鍵約束可以實現:

1、 主表中沒有的從表中不允許插入

2、 從表中有的主表中不允許刪除

3、 不能更改主表中的值而導致從表中的記錄孤立存在。

4、 先刪除從表,再刪除主表

1.16.2 外來鍵(foreign key)

1、 外來鍵:從表中的公共欄位,公共欄位的名字可以不一樣,但是資料型別必須一樣。

2、 外來鍵約束用來保證引用完整性

1.16.3 新增外來鍵

方法一:建立表的時候新增外來鍵

create table stuinfo(
	stuno char(4) primary key,
	name varchar(10) not null
);

create table stumarks(
	stuid char(4) primary key,
	score tinyint unsigned,
	foreign key (stuid) references stuinfo(stuno)
);

方法二:修改表的時候新增外來鍵

mysql> create table stuinfo(
    ->  stuno char(4) primary key,
    ->  name varchar(10) not null
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> create table stumarks(
    ->  stuid char(4) primary key,
    ->  score tinyint unsigned
    -> );
Query OK, 0 rows affected (0.06 sec)

語法:  alter table 從表 add foreign key (從表的公共欄位) references 主表(公共欄位)

mysql> alter table stumarks add foreign key (stuid) references stuinfo(stuno);
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

腳下留心:要建立外來鍵必須是innodb引擎,myisam不支援外來鍵約束

1.16.4 檢視外來鍵

在這裡插入圖片描述

1.16.5 刪除外來鍵

通過外來鍵的名字刪除外來鍵

語法:alter table 表名 drop foreign key 外來鍵名

例題

mysql> alter table stumarks drop foreign key stumarks_ibfk_1;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

1.17 外來鍵操作

1、 嚴格操作(前面講的是嚴格操作)

2、 置空操作(set null):如果主表記錄刪除或更新,從表置空

3、 級聯操作(cascade):如果主表記錄刪除或更新,從表級聯

一般來說:主表刪除的時候,從表置空操作,主表更新的時候,從表級聯操作。

語法:foreign key(外來鍵) references 主表(關鍵欄位)[主表刪除是的動作][主表更新時候的動作]

例題

mysql> create table stuinfo(
    -> stuno char(4) primary key,
    -> name varchar(10) not null
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> create table stumarks(
    -> stuid int auto_increment primary key,
    -> stuno char(4) ,
    -> score tinyint unsigned,
    ->  foreign key (stuno) references stuinfo(stuno) on delete set null on update cascade
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> insert into stuinfo values ('s101','tom');
Query OK, 1 row affected (0.00 sec)

mysql> insert into stumarks values (null,'s101',88);
Query OK, 1 row affected (0.00 sec)

mysql> select * from stuinfo;
+-------+------+
| stuno | name |
+-------+------+
| s101  | tom  |
+-------+------+
1 row in set (0.00 sec)

mysql> update stuinfo set stuno='s102' where stuno='s101';   # 更新時級聯
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from stumarks;
+-------+-------+-------+
| stuid | stuno | score |
+-------+-------+-------+
|     1 | s102  |    88 |
+-------+-------+-------+
1 row in set (0.00 sec)

mysql> delete from stuinfo where stuno='s102';    # 刪除時置空
Query OK, 1 row affected (0.02 sec)

mysql> select * from stumarks;
+-------+-------+-------+
| stuid | stuno | score |
+-------+-------+-------+
|     1 | NULL  |    88 |
+-------+-------+-------+
1 row in set (0.00 sec)

1.18客戶端介紹

第一:命令列

第二:MySQL-Front和Navicat

MySQL-Front

在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述