mysql之外键约束
關于數據的幾點說明:
A、約束保證數據的完整性和一致性
B、約束分為表級約束和列級約束,兩者之間的區別是約束針對字段的數目的多少來決定的;列級約束只針對一個數據列來約束,表級約束針對兩個或者兩個以上的數據建立的約束,列級約束既可以在列定義建立約束,也可以在列定義后聲明,而表級約束只能在列定義后聲明。列級約束使用較多,表級約束使用較少,而NOT NULL?和 DEFAULT這兩種約束只有列級約束。?
C、約束的類型:
? ? NOT NULL(非空約束)、PRIMARY KEY(主鍵約束)、UNIQUE KEY(唯一約束)、DEFAULT(默認約束)、FOREIGN KEY(外鍵約束)
關于外鍵約束是為了保證數據的完整性,一致性,實現一對一或者一對多的關系。
外鍵約束的要求如下:
1、父表和子表必須使用相同的存儲引擎,而且禁止使用臨時表
2、數據表的存儲引擎必須為InooDB
在my.ini的配置文件中,修改為如下配置
default-storage-engine=INNODB3、外鍵列和參照列必須具有相似的數據類型;數字的長度或是否有符號位必須相同,而字符長度可以不同
在test數據庫創建數據表
root@localhost test>CREATE TABLE province(-> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,-> pname VARCHAR(20)-> ); Query OK, 0 rows affected (0.09 sec)刪除數據表如何實現呢?
DROP TABLE table_name查看創建的數據表是否為InooDB類型
root@localhost test>show create table province; root@localhosttest>create table user(-> id smallint unsigned primary key auto_increment,-> username varchar(10),-> pid smallint unsigned, 用來存儲省份的編號,作為參照表將參考父表rpovince中的 id 的字段,且數據類型要相似-> foreign key (pid) references province (id) pid是外鍵,參照 province 中的 id 字段-> ); Query OK, 0 rows affected (0.09 sec)現在有外鍵的這張表成為子表即是 user?表,父表示所參照的表?即是 provicne?表,外鍵列為? pid ,參照列為?id?列,那么我們沒有為id?創建索引,但是因為我們指定了 id?為主鍵(外鍵約束),而主鍵在創建時會自動創建索引 ,進行查看一下:
root@localhost test>show index from province;或者使用,顯示不同的方式
root@localhosttest>show index from province\G;現在來查看子表的索引創建情況:
root@localhosttest>show index from user\G;此外,可以查看子表的信息
root@localhost test>show create table user;4、外鍵列和參照列必須創建索引,如果外鍵列不存在索引的話,mysql將自動創建索引。
所謂的外鍵列就是加了FOREIGN KEY的那一列
而外鍵約束的參照操作(即是在更新表的時候,子表是否進行相應的操作)包括:
1、CASCADE:從父表中刪除或者更新且自動刪除或者更新子表中匹配的行
2、SET NULL:從父表刪除或者更新行,并設置子表中的外鍵列為 NULL ,如果使用該選項,必須保證子表列沒有指定 NOT NULL
3、RESTRICT:拒絕對父表的刪除或者更新操作
4、NOT ACTION:標準的 SQL 關鍵字,在 MYSQL 中與 RESTRICT 相同
root@localhosttest>create table user1(-> id smallint unsigned primary key auto_increment,-> username varchar(10),-> pid smallint unsigned,-> foreign key (id) references province(id) on delete cascade 在刪除時進行一種什么的操作-> );對表?user1?進行查看
root@localhost test>show create table user1;即是在父表中刪除或者更新父表中的記錄時也同步刪除或者更新子表中相應的行,因此在兩張表中有相應的記錄。必須先在父表中插入記錄,然后再在子表中插入記錄,因為子表參照的事父表中的信息。
現在在父表中插入記錄,由于 provicne?表中只有兩個字段,分別是 id?和?省份名稱,由于 id?為自動編號,所以只需操作省份名稱
root@localhosttest>insert? province(pname) values ('A'); root@localhosttest>insert? province(pname) values ('B'); root@localhosttest>insert? province(pname) values ('C');進行查看:
root@localhosttest>SELECT * FROM province;現在在 user1 表中寫幾條記錄
root@localhosttest>insert user1(username,pid) values('Tom',3); root@localhosttest>insert user1(username,pid) values('Junt,7); root@localhosttest>insert user1(username,pid) values('Rose',4);并進行查看,使用命令 select * from user1;
即是 Tom?所在省份的 id?是 3,就是省份的名稱
刪除表中的記錄
delete from table_name where condition; root@localhosttest>delete from province where id=3; 刪除一行刪除之后,進行查看
故而即是從父表中刪除記錄時,子表也隨著相應的刪除記錄。
在外鍵約束當中,在實際的開發過程中,我們很少使用物理的外鍵約束,很多都去使用邏輯的外鍵約束,因為物理的外鍵約束只有INNODB這種引擎才會支持,像我們另外的一種引擎MYISAM的引擎則不支持,反過來說,如果我想創建的數據表,假設存儲引擎為MYISAM,而且又想使用外鍵約束的話,其實是不可能實現的,所以說,我們在實際的項目開發中,我們不去定義物理的外鍵,所謂的邏輯外鍵指的是就是我們在定義兩張表的結構的時候,我們是按照存在的某種結構的方式去定義,但是不去使用FOREIGN KEY這個關鍵詞來定義。
a、刪除部分記錄時,使用delete;
b、刪除所有記錄時保留該表的結構,使用truncate;
c、刪除數據表時,使用drop;
查看users表中的記錄
由于上文中已經使用了delete刪除了記錄,這里清除所有記錄
root@localhost test>truncate table users;或者使用delete進行刪除,由于delete條件可選,因此更加靈活,而truncate清除了表中的數據而保留表的結構。
root@localhost test>delete from users;當表不在需要的時候進行刪除
root@localhost test>drop table users;總結
以上是生活随笔為你收集整理的mysql之外键约束的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 同网段不同网段主机间通信原理
- 下一篇: 数据库相关命令