例題SQL語句詳解-資料庫基本操作9-完整性介紹
阿新 • • 發佈:2018-12-10
|
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