1. 程式人生 > >Learning-MySQL【4】:表的操作管理和 MySQL 的約束控制

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 語句

SHOW CREATE TABLE 語句

語法格式: 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 的約束