Learning-MySQL【4】:表的操作管理和 MySQL 的約束控制
一、表的操作
1、表的基本概念
資料庫與表之間的關係:資料庫是由各種資料表組成的,資料表是資料庫中最重要的物件,用來儲存和操作資料的邏輯結構。
表由列和行組成,列是表資料的描述,行是表資料的例項。
表的操作:建立新表、修改表和刪除表。
2、建立表
建立資料表可使用 CREATE TABLE 命令
語法格式:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name
[([column_definition], … | [index_definition])]
[table_option] [select_statement ];
注意:在同一個資料庫中,表名不能有重名。
【例1】在 studentInfo 資料庫中建立 Student 表,包括欄位:學號(sno,非空,char(10)),姓名(sname,非空,varchar(20)),性別(ssex,char(2)),出生日期(sbirth,data,非空),專業號(zno,varchar(20)),班級(sclass,varchar(10))
3、查看錶
1)顯示錶的名稱
語法格式:
SHOW TABLES ;
【例2】顯示資料庫 studentInfo 中所有的表
2)顯示錶的結構
查看錶結構有簡單查詢和詳細查詢,可使用 DESCRIBE / DESC 語句
語法格式: DESCRIBE 表名; 或者 DESC 表名; 或者 SHOW CREATE TABLE 表名;
【例3】3 種命令顯示資料庫 studentInfo 中表 student 的結構
4、修改表
ALTER TABLE 用於更改原有的結構。例如,可以增加或刪除列、重新命名列或表,還可以修改字符集。
語法格式:
alter [ ignore] table table_name
alter_specification [, alter_specification ]
add [column] column_definition[ first | after col_name] // 新增欄位
| alter [column] col_name {set default literal | drop default} // 修改欄位
| change [column] old_col_name column_definition [first| after col_name] // 重新命名欄位
| modify [column] column_definition [first | after col_name] // 修改欄位
| drop [column] col_name // 刪除列
| rename [to] new_table_name // 對錶重新命名
| order by col_name // 按欄位排序
| convert to character set character_name [collate collation_name] // 將欄位集轉化為二進位制
| [default] character set charset_name [collate collation_name] // 修改字符集
【例4】在 student 表的出生日期欄位後新增一個數據型別為 char,長度為 20 的欄位 scollege,允許為空,表示學生所在學院
【例5】還使用 alter table 命令把 scollege 欄位刪除
【例6】把 student 表名改為 stu
5、複製表
語法格式:
create [temporary] table [if not exists] table_name
[ () like old_table_name [] ]
| [AS (select_statement)];
【例7】複製 stu 表到 student 表中
【例8】複製 stu 表中的學號(sno),姓名(sname)到新的表 SnoNameTable
6、刪除表
刪除表可以用 DROP TABLE 命令
語法格式:
drop table [if exists] table_name [,table_name] …
【例9】刪除 stu 表和 SnoNameTable 表
可以用 show tables 命令檢視 studentInfo 中現在剩餘的表
7、表管理中的注意事項
1)關於空值(NULL)的說明
空值通常用於表示未知、不可用或將在以後新增的資料,切不可將它與數字 0 或字元型別的空字元混為一談。
2)關於列的標誌(IDENTITY)屬性
任何表都可以建立一個包含系統所生成序號值的標誌列。該序號值唯一標誌表中的一列,且可以作為鍵值。
3)關於列型別的隱含改變
在 MySQL 中,系統會隱含地改變在 CREATE TABEL 語句或 ALTER TBALE 語句中所指定的列型別。
長度小於 4 的 VARCHAR 型別會被改變為 CHAR 型別。
二、MySQL 約束控制
1、資料完整性約束
資料的完整性總體來說可分為以下 4 類,即實體完整性、參照完整性、域完整性和使用者自定義完整性
實體完整性:實體的完整性強制表的識別符號列或主鍵的完整性(通過約束,唯一約束,主鍵約束或標識列屬性)
參照完整性:在刪除和輸入記錄時,引用完整性保持表之間已定義的關係,引用完整性確保鍵值在所有表中一致。
域完整性:限制類型(資料型別),格式(檢查約束和規則),可能值範圍(外來鍵約束,檢查約束,預設值定義,非空約束和規則)
使用者自定義完整性:使用者自己定義的業務規則。
2、欄位的約束
設計資料庫時,可以對資料庫表中的一些欄位設定約束條件,由資料庫管理系統(如 MySQL)自動檢測輸入的資料是否滿足約束條件,不滿足約束條件的資料,資料庫管理系統拒絕錄入。MySQL 支援的常用約束條件有 6 種:主鍵(primary key)約束、外來鍵(foreign key)約束、非空(not null)約束、唯一性(unique)約束、預設值(default)約束、自增約束(auto_increment)及檢查(check)約束。其中,檢查約束需要藉助觸發器或者 MySQL 複合資料型別實現。
1)主鍵(primary key)約束
設計資料庫時,建議為所有的資料庫表都定義一個主鍵,用於保證資料庫表中記錄的唯一性。一張表中只允許設定一個主鍵,這個主鍵可以是一個欄位,也可以是一個欄位組(不建議使用複合主鍵)。在錄入資料的過程中,必須在所有主鍵欄位中輸入資料,即任何主鍵欄位的值不允許為 NULL。
設定主鍵通常有兩種方式:表級完整性約束和列級完整性約束。
假設一個表的主鍵是單個欄位ID。如果用表級完整性約束,就是用 PRIMARY KEY 命令單獨設定主鍵為 ID 列。
語法規則:
PRIMARY KEY(欄位名)
【例10】建立學生 stu1 表,用表的完整性設定學號 sno 欄位為主鍵
如果用列級完整性約束,就是直接在該欄位的資料型別或者其他約束條件後加上 “primary key” 關鍵字,即可將該欄位設定為主鍵約束。
語法規則:
欄位名 資料型別[其他約束條件] primary key
【例11】建立學生 stu2 表,用列的完整性設定學號 sno 欄位為主鍵
如果一個表的主鍵是多個欄位的組合,定義完所有的欄位後,設定複合主鍵。
語法規則:
primary key (欄位名1, 欄位名2)
【例12】使用下面的 SQL 語句在 studentInfo 資料庫中建立 SC 表,並將 (sno,cno) 的欄位組合設定為 SC 表的主鍵
2)外來鍵(foreign key)約束
外來鍵約束主要用於定義表與表之間的某種關係。表 A 外來鍵欄位的取值,要麼是 null,要麼是來自於表 B 主鍵欄位的取值(此時將表 A 稱之為表 B 的子表,表 B 稱之為表 A 的父表)
由於子表和父表之間的外來鍵約束關係:
(1)如果子表的記錄 “參照” 了父表的某條記錄,那麼父表這一條記錄的刪除(delete)或修改(update)操作可能以失敗告終。
(2)如果試圖直接插入(insert)或者修改(update)子表的 “外來鍵值” ,子表中的 “外來鍵值” 必須是父表中的 “主鍵值”,要麼是 NULL,否則插入(insert)或者修改(update)操作失敗。
例如,學生 student 表的班級號 class_no 欄位的值要麼是 null,要麼是來自於班級 classes 表的 class_no 欄位的取值。也可以這樣說,學生 student 表的 class_no 欄位的取值必須參照(reference)班級 classes 表的 class_no 欄位的取值
在表 A 中外來鍵的設定也有兩種方式,一種是在表級完整性下定義外來鍵約束,一種是在列級完整性下定義外來鍵約束
表級完整性語法規則如下:
foregin key (表A的欄位名列表) references (表B的欄位名列表)
[ on delete {cascade| restrict |set null | no action} ]
[on update {cascade| restrict |set null | no action} ]
級聯的選項有四種取值,其意義如下:
cascade:父表記錄的刪除(delete)或修改(update)操作會自動刪除或修改子表中與之對應的記錄。
set null:父表記錄的刪除(delete)或修改(update)操作會將子表中與之對應記錄的外來鍵值自動設定為 null 值。
no action:父表記錄的刪除(delete)或修改(update)操作如果子表存在與之對應的記錄,那麼刪除或修改操作將失敗。
restrict:與 no action 功能相同,且為級聯選項的預設值。
如果表已經建好,那麼可以通過 alter table 命令新增,語法如下:
alter table table_name
add [ constraint 外來鍵名] foregin key [id](index_col_name, ……)
references table_name(index_col_name, ……)
[ on delete {cascade| restrict |set null | no action} ]
[ on update {cascade| restrict |set null | no action} ]
【例13】將 sc 表的 sno 欄位設定為外來鍵,該欄位的值參照(reference)班級 student 表的 sno 欄位的取值
在列級完整性下定義外來鍵約束,就是直接在列的後面新增 references 命令,例如:
表級完整性約束和列級完整性約束都是在 CREATE TABLE 語句中定義。還有另外一種方式,就是使用完整性約束命名字句 CONSTRAINT,用來對完整性約束條件命名,從而可以靈活的增加、刪除一個完整性約束條件。
完整性約束命名字句格式:
constraint <完整性約束條件名> [PRIMARY KEY 短語| FOREIGN KEY 短語 | CHECK 短語]
【例14】建立 sc 表,將 sno 欄位設定為外來鍵
3)非空(not NULL)約束
如果某個欄位滿足非空約束的要求,則可以向該欄位新增非空約束。非空約束限制該欄位的內容不能為空,但可以是空白。
語法規則:
欄位名 資料型別 not null
【例15】將學生 student 表的姓名 sname 欄位設定為非空約束
4)唯一性(unique)約束
如果某個欄位滿足唯一性約束要求,則可以向該欄位新增唯一性約束。與主鍵約束不同,一張表中可以存在多個唯一性約束,並且滿足唯一性約束的欄位可以取 NULL 值。
語法規則:
欄位名 資料型別 unique
【例16】建立班級 classes 表,班級名 class_name 欄位設定為非空約束以及唯一性約束
5)預設值(default)約束
如果某個欄位滿足預設值約束要求,可以向該欄位新增預設值約束。
語法規則:
欄位名 資料型別 [其他約束條件] default 預設值
【例17】建立課程 course 表,其 up_limit 欄位設定預設值約束,且預設值為整數 60
6)自增(auto_increment)約束
AUTO_INCREMENT 是 MySQL 唯一擴充套件的完整性約束,當為資料庫表中插入新記錄時,欄位上的值會自動生成唯一的 ID 。
語法格式:
CREATE TABLE table_name( 屬性名 資料型別 AUTO_INCREMENT, …… );
【例18】建立表 t_dept 時,設定 deptno 欄位為 AUTO_INCREMENT 和 PK 約束
7)刪除(delete)約束
一個欄位的所有約束都可以用 alter table 命令刪除
【例19】刪除表 sc 中名稱為 sc_studen_fk 的約束