第九章結構化查詢語言 SQL - 資料定義語言 (DDL) 資料庫系統設計理論李紹綸著
SQL 的資料定義語言 本章內容 建立資料表 修改資料表 刪除資料表 FOREIGN KEY 外鍵條件約束與資料表關聯性 2
資料定義語言可分為下列三種 : SQL 的資料定義語言 CREATE TABLE 指令 : 用來建立一個基底關聯表, 和設定關聯表相關的完整性限制 CREATE VIEW 指令 : 用來建立一個視界, 我們將在第十三章再來介紹 CREATE INDEX 指令 : 用來建立一個關聯表的索引, 我們將在第十四章再來介紹 3
公司 資料庫各個關聯表綱目 員工關聯表綱目 欄位名稱 資料型別 長度 允許 Null 屬性 身分證號碼 char 10 否 姓名 varchar 15 否 生日 datetime 是 員工電話關聯表綱目 欄位名稱 資料型別 長度 允許 Null 屬性 身分證號碼 char 10 否 電話 char 10 否 地址 varchar 30 是 薪水 decimal 是 預設值 :25000 整數位數:10 小數位數:0 直屬上司 char 10 是 工作部門 int 是 部門關聯表綱目 欄位名稱 資料型別 長度 允許 Null 屬性 部門代號 int 否 識別 : 是 識別值種子 :1 識別增值量:1 部門名稱 varchar 15 否 經理身分證號碼 char 10 是 到職日 datetime 是 計劃關聯表綱目 欄位名稱資料型別長度允許 Null 屬性 員工眷屬關聯表綱目 欄位名稱 資料型別 長度 允許 Null 屬性 身分證號碼 char 10 否 眷屬姓名 varchar 15 否 關係 char 10 是 參加關聯表綱目 欄位名稱資料型別長度允許 Null 屬性 計劃代號 int 否 識別 : 是 識別值種子 :1 識別增值量:1 計劃名稱 varchar 15 否 執行地點 char 10 是 委託單位 char 10 是 控制部門 int 是 身分證號碼 char 10 否 計劃代號 int 否 工作時數 int 是 4
公司 資料庫各個資料表 5
公司資料庫實體關係圖 6
建立資料表 CREATE TABLE 指令敘述格式如下 : CREATE TABLE [ database_name. [ schema_name ]. schema_name. ] table_name ( { <column_definition> <computed_column_definition> } [ <table_constraint> ] [,...n ] ) [ ON { partition_scheme_name ( partition_column_name ) filegroup "default" } ] [ { TEXTIMAGE_ON { filegroup "default" } ] <column_definition> ::= column_name <data_type> [ COLLATE collation_name ] [ NULL NOT NULL ] [ [ CONSTRAINT constraint_name ] DEFAULT constant_expression ] [ IDENTITY [ ( seed,increment ) ] [ NOT FOR REPLICATION ] ] [ ROWGUIDCOL ] [ <column_constraint> [...n ] ] <data type> ::= [ type_schema_name. ] type_name [ ( precision [, scale ] max [ { CONTENT DOCUMENT } ] xml_schema_collection ) ] 7
< table_constraint > ::= [ CONSTRAINT constraint_name ] { { PRIMARY KEY UNIQUE } [ CLUSTERED NONCLUSTERED ] (column [ ASC DESC ] [,...n ] ) [ WITH FILLFACTOR = fillfactor WITH ( <index_option> [,...n ] ) ] [ ON { partition_scheme_name (partition_column_name) filegroup "default" } ] FOREIGN KEY ( column [,...n ] ) REFERENCES referenced_table_name [ ( ref_column [,...n ] ) ] [ ON DELETE { NO ACTION CASCADE SET NULL SET DEFAULT } ] [ ON UPDATE { NO ACTION CASCADE SET NULL SET DEFAULT } ] [ NOT FOR REPLICATION ] CHECK [ NOT FOR REPLICATION ] ( logical_expression ) } <index_option> ::= { PAD_INDEX = { ON OFF } FILLFACTOR = fillfactor IGNORE_DUP_KEY = { ON OFF } STATISTICS_NORECOMPUTE = { ON OFF } ALLOW_ROW_LOCKS = { ON OFF} ALLOW_PAGE_LOCKS ={ ON OFF} } 建立資料表 8
<column_constraint> ::= [ CONSTRAINT constraint_name ] { { PRIMARY KEY UNIQUE } [ CLUSTERED NONCLUSTERED ] [ WITH FILLFACTOR = fillfactor WITH ( < index_option > [,...n ] ) ] [ ON { partition_scheme_name ( partition_column_name ) filegroup "default" } ] [ FOREIGN KEY ] REFERENCES [ schema_name. ] referenced_table_name [ ( ref_column ) ] [ ON DELETE { NO ACTION CASCADE SET NULL SET DEFAULT } ] [ ON UPDATE { NO ACTION CASCADE SET NULL SET DEFAULT } ] [ NOT FOR REPLICATION ] CHECK [ NOT FOR REPLICATION ] ( logical_expression ) } 建立資料表 <computed_column_definition> ::= column_name AS computed_column_expression [ PERSISTED [ NOT NULL ] ] [ [ CONSTRAINT constraint_name ] { PRIMARY KEY UNIQUE } [ CLUSTERED NONCLUSTERED ] [ WITH FILLFACTOR = fillfactor WITH ( <index_option> [,...n ] ) ] [ FOREIGN KEY ] REFERENCES referenced_table_name [ ( ref_column ) ] [ ON DELETE { NO ACTION CASCADE } ] [ ON UPDATE { NO ACTION } ] [ NOT FOR REPLICATION ] CHECK [ NOT FOR REPLICATION ] ( logical_expression ) [ ON { partition_scheme_name ( partition_column_name ) filegroup "default" } ] ] 9
範例 9.1 請在 公司 資料庫中建立一個名為 員工 的資料表 10
修改資料表 ALTER TABLE 指令敘述格式如下 : ALTER TABLE [ database_name. [ schema_name ]. schema_name. ] table_name { ALTER COLUMN column_name { [ type_schema_name. ] type_name [ ( { precision [, scale ] max xml_schema_collection } ) ] [ NULL NOT NULL ] [ COLLATE collation_name ] {ADD DROP } { ROWGUIDCOL PERSISTED } } [ WITH { CHECK NOCHECK } ] ADD { <column_definition> <computed_column_definition> <table_constraint> } [,...n ] DROP { [ CONSTRAINT ] constraint_name [ WITH ( <drop_clustered_constraint_option> [,...n ] ) ] COLUMN column_name } [,...n ] [ WITH { CHECK NOCHECK } ] { CHECK NOCHECK } CONSTRAINT { ALL constraint_name [,...n ] } { ENABLE DISABLE } TRIGGER { ALL trigger_name [,...n ] } SWITCH [ PARTITION source_partition_number_expression ] TO [ schema_name. ] target_table [ PARTITION target_partition_number_expression ] } 11
<column_definition> ::= column_name [ type_schema_name. ] type_name [ ( { precision [, scale ] max [ { CONTENT DOCUMENT } ] xml_schema_collection } ) ] [ [ CONSTRAINT constraint_name ] DEFAULT constant_expression [ WITH VALUES ] IDENTITY [ (seed, increment ) ] [ NOT FOR REPLICATION ] ] [ ROWGUIDCOL ] [ COLLATE < collation_name > ] [ <column_constraint> [...n ] ] <column_constraint> ::= [ CONSTRAINT constraint_name ] { [ NULL NOT NULL ] { PRIMARY KEY UNIQUE } [ CLUSTERED NONCLUSTERED ] [ WITH FILLFACTOR =fillfactor ] [ WITH ( <index_option> [,...n ] ) ] [ ON { partition_scheme_name (partition_column_name) filegroup "default" } ] [ FOREIGN KEY ] REFERENCES [ schema_name. ] referenced_table_name [ ( ref_column ) ] [ ON DELETE { NO ACTION CASCADE SET NULL SET DEFAULT } ] [ ON UPDATE { NO ACTION CASCADE SET NULL SET DEFAULT } ] [ NOT FOR REPLICATION ] CHECK [ NOT FOR REPLICATION ] DEFAULT constant_expression [ WITH VALUES ] ( logical_expression ) } 修改資料表 12
<computed_column_definition> ::= column_name AS computed_column_expression [ PERSISTED [ NOT NULL ] ] [ [ CONSTRAINT constraint_name ] { PRIMARY KEY UNIQUE } [ CLUSTERED NONCLUSTERED ] [ WITH FILLFACTOR = fillfactor ] [ WITH ( <index_option> [,...n ] ) ] [ ON { partition_scheme_name ( partition_column_name ) filegroup "default" } ] [ FOREIGN KEY ] REFERENCES ref_table [ ( ref_column ) ] [ ON DELETE { NO ACTION CASCADE } ] [ ON UPDATE { NO ACTION } ] [ NOT FOR REPLICATION ] CHECK [ NOT FOR REPLICATION ] ( logical_expression ) ] 修改資料表 <table_constraint> ::= [ CONSTRAINT constraint_name ] { { PRIMARY KEY UNIQUE } [ CLUSTERED NONCLUSTERED ] (column [ ASC DESC ] [,...n ] ) [ WITH FILLFACTOR = fillfactor [ WITH ( <index_option>[,...n ] ) ] [ ON { partition_scheme_name ( partition_column_name... ) filegroup "default" } ] FOREIGN KEY ( column [,...n ] ) REFERENCES referenced_table_name [ ( ref_column [,...n ] ) ] [ ON DELETE { NO ACTION CASCADE SET NULL SET DEFAULT } ] [ ON UPDATE { NO ACTION CASCADE SET NULL SET DEFAULT } ] [ NOT FOR REPLICATION ] DEFAULT constant_expression FOR column [ WITH VALUES ] CHECK [ NOT FOR REPLICATION ] ( logical_expression ) } 13
< index_option > ::= { PAD_INDEX = { ON OFF } FILLFACTOR = fillfactor IGNORE_DUP_KEY = { ON OFF } STATISTICS_NORECOMPUTE = { ON OFF } ALLOW_ROW_LOCKS= { ON OFF } ALLOW_PAGE_LOCKS={ ON OFF } SORT_IN_TEMPDB = { ON OFF } ONLINE = { ON OFF } MAXDOP = max_degree_of_parallelism } 修改資料表 <drop_clustered_constraint_option > ::= { MAXDOP = max_degree_of_parallelism ONLINE = {ON OFF } MOVE TO { partition_scheme_name ( column_name ) filegroup "default"} } 14
範例 9.2 請在 公司 資料庫中修改 員工 資料表, 增加一個 年齡 欄位, 並將資料型別設為 INT 和允許虛值 15
範例 9.3 請在 公司 資料庫中修改 員工 資料表, 變更一個 年齡 資料表欄位的資料型別, 將其資料類型由 INT 改為 DECIMAL(3,0) 16
範例 9.4 請在 公司 資料庫中修改 員工 資料表, 刪除一個 年齡 欄位 17
範例 9.5 請在 公司 資料庫中修改 員工 資料表, 將 身分證號碼 欄位設定為主鍵 18
範例 9.6 請在 公司 資料庫中修改 員工 資料表, 將 身分證號碼 欄位取消設定為主鍵 19
範例 9.7 請在 公司 資料庫中修改 員工 資料表, 將 姓名 欄位設定為次選鍵 20
範例 9.8 請在 公司 資料庫中修改 員工 資料表, 刪除 姓名 欄位 UNIQUE 次選鍵條件約束 21
範例 9.9 請在 公司 資料庫中修改 員工 資料表, 加入一檢查條件約束將 薪水 欄位屬性值限制在 17280 元和 200000 元範圍之間 22
範例 9.10 請在 公司 資料庫中修改 員工 資料表, 刪除 薪水 欄位檢查條件約束 23
刪除資料表 DROP TABLE 指令敘述格式如下 : DROP TABLE [ database_name. [ schema_name ]. schema_name. ] table_name [,...n ] [ ; ] 24
範例 9.11 請在 公司 資料庫中刪除一個名為 員工 的資料表 25
建立 公司 資料庫各個資料表的 SQL 指令敘述 26
建立 公司 資料庫各個資料表外鍵關聯性的 SQL 指令敘述 27