您可以在 [SQL 檢視] 中撰寫數據定義查詢,以在 Access 中建立及修改數據表、限制式、索引和關聯。 本文將說明數據定義查詢,以及如何使用這些查詢來建立數據表、限制式、索引和關聯。 本文也可以協助您決定何時使用數據定義查詢。
本文內容
概觀
不同於其他 Access 查詢,資料定義查詢不會擷取數據。 相反地,資料定義查詢會使用數據定義語言來建立、修改或刪除資料庫物件。
附註: 數據定義語言 (DDL) 是 SQL (結構化查詢語言) 的一部分。
數據定義查詢可能非常方便。 您可以只執行一些查詢,定期刪除及重新建立資料庫架構的部分。 如果您熟悉 SQL 語句,並打算刪除並重新建立特定的數據表、限制式、索引或關聯,請考慮使用數據定義查詢。
警告: 使用數據定義查詢修改資料庫物件可能會有風險,因為動作不會伴隨確認對話方塊。 如果您出錯,可能會遺失數據,或不小心變更數據表的設計。 當您使用資料定義查詢修改資料庫中的物件時,請務必小心。 如果您不負責維護所使用的資料庫,您應先洽詢資料庫管理員,再執行數據定義查詢。
重要: 在執行資料定義查詢之前,請先備份包含的任何數據表複本。
DDL 關鍵詞
關鍵字 |
用途 |
CREATE |
建立不存在的索引或數據表。 |
ALTER |
修改現有的數據表或數據行。 |
DROP |
刪除現有的數據表、數據行或限制式。 |
ADD |
在數據表中新增欄或限制式。 |
COLUMN |
搭配 ADD、ALTER 或 DROP 使用 |
CONSTRAINT |
搭配 ADD、ALTER 或 DROP 使用 |
INDEX |
搭配 CREATE 使用 |
TABLE |
搭配 ALTER、CREATE 或 DROP 使用 |
建立或修改數據表
若要建立數據表,請使用 [建立表格] 命令。 [建立表格] 命令具有下列語法:
CREATE TABLE table_name
(field1 type [(size)] [NOT NULL] [index1] [, field2 type [(size)] [NOT NULL] [index2] [, ...][, CONSTRAINT constraint1 [, ...]])
CREATE TABLE 命令的唯一必要元素是 CREATE TABLE 命令本身和資料表名稱,但通常您會想要定義數據表的某些欄位或其他層面。 請考慮這個簡單的範例。
假設您想要建立數據表來儲存您考慮購買的二手車名稱、年份和價格。 您想要允許最多 30 個字元的名稱,以及 4 個字元的年份。 若要使用資料定義查詢建立資料表,請執行下列動作:
附註: 您可能需要先啟用資料庫的內容,資料定義查詢才能執行:
-
在 [訊息列] 上,按一下 [啟用內容]。
建立表格
-
在 [ 建立] 索引 標籤 的 [宏 & 程式代碼 ] 群組中,按兩下 [查詢設計]。
-
在 [ 設計] 索引 標籤的 [ 查詢類型] 群組中,按兩下 [ 資料定義]。
設計網格線會隱藏起來,並顯示 [SQL 檢視物件] 索引標籤。
-
輸入下列 SQL 語句:
建立 TABLE Cars (名稱文字 (30) 、年文字 (4) 、價格貨幣)
-
在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]。
修改表格
若要修改資料表,請使用 ALTER TABLE 命令。 您可以使用 ALTER TABLE 命令來新增、修改或捨棄 (移除) 欄或限制式。 ALTER TABLE 命令具有下列語法:
ALTER TABLE table_name predicate
其中,述詞可以是下列其中一項:
ADD COLUMN field type[(size)] [NOT NULL] [CONSTRAINT constraint]
ADD CONSTRAINT multifield_constraint
ALTER COLUMN field type[(size)]
DROP COLUMN field
DROP CONSTRAINT constraint
假設您要新增 10 個字元的文字欄位,以儲存每一車條件的相關信息。 您可以執行下列動作:
-
在 [ 建立] 索引 標籤 的 [宏 & 程式代碼 ] 群組中,按兩下 [查詢設計]。
-
在 [ 設計] 索引 標籤的 [ 查詢類型] 群組中,按兩下 [ 資料定義]。
設計網格線會隱藏起來,並顯示 [SQL 檢視物件] 索引標籤。
-
輸入下列 SQL 語句:
ALTER TABLE Cars ADD COLUMN 條件文字 (10)
-
在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]。
建立索引
若要在現有數據表上建立索引,請使用 [建立索引] 命令。 CREATE INDEX 命令具有下列語法:
CREATE [UNIQUE] INDEX index_name
ON table (field1 [DESC][, field2 [DESC], ...]) [WITH {PRIMARY | DISALLOW NULL | IGNORE NULL}]
唯一的必要元素是 CREATE INDEX 命令、索引名稱、ON 自變數、包含您要編制索引之欄位的數據表名稱,以及要包含在索引中的欄位清單。
-
DESC 自變數會讓索引以遞減順序建立,如果您經常執行查詢以尋找索引欄位的頂端值,或是以遞減順序排序索引字段,則此自變數會很有用。 根據預設,系統會以遞增順序建立索引。
-
WITH PRIMARY 自變數會建立索引字段或字段做為數據表的 主索引鍵 。
-
WITH DISALLOW NULL 自變數會讓索引要求輸入索引欄位的值,也就是不允許 Null 值。
假設您有一個名為 [汽車] 的數據表,其中包含儲存您考慮購買的二手車名稱、年份、價格和條件的欄位。 此外,假設數據表已經變得很大,而且您經常在查詢中包含年份欄位。 您可以在 [年份] 字段上建立索引,以使用下列程序協助查詢更快速地傳回結果:
-
在 [ 建立] 索引 標籤 的 [宏 & 程式代碼 ] 群組中,按兩下 [查詢設計]。
-
在 [ 設計] 索引 標籤的 [ 查詢類型] 群組中,按兩下 [ 資料定義]。
設計網格線會隱藏起來,並顯示 [SQL 檢視物件] 索引標籤。
-
輸入下列 SQL 語句:
建立 INDEX YearIndex on Cars (Year)
-
在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]。
建立限制式或關聯
限制式會建立在插入值時,字段或字段組合必須符合的邏輯條件。 例如,UNIQUE 限制式可防止受限制的欄位接受重複欄位現有值的值。
關聯是一種限制式類型,指的是參照另一個數據表中欄位的值或欄位組合的值,以判斷是否可以在受限制的欄位或欄位組合中插入值。 您不會使用特殊關鍵詞指出限制式是關聯。
若要建立限制式,請在 CREATE TABLE 或 ALTER TABLE 命令中使用 CONSTRAINT 子句。 CONSTRAINT 子句有兩種:一種用於在單一欄位上建立限制式,另一種用於在多個字段上建立限制式。
單一欄位限制式
單一欄位 CONSTRAINT 子句會立即遵循其限制的欄位定義,並具有下列語法:
CONSTRAINT constraint_name {PRIMARY KEY | UNIQUE | NOT NULL |
REFERENCES foreign_table [(foreign_field)] [ON UPDATE {CASCADE | SET NULL}] [ON DELETE {CASCADE | SET NULL}]}
假設您有一個名為 [汽車] 的數據表,其中包含儲存您考慮購買的二手車名稱、年份、價格和條件的欄位。 也假設您經常忘記輸入車用條件的值,而且總是想要記錄這項資訊。 您可以使用下列程式,在 [條件] 字段上建立限制式,防止您將字段留空:
-
在 [ 建立] 索引 標籤 的 [宏 & 程式代碼 ] 群組中,按兩下 [查詢設計]。
-
在 [ 設計] 索引 標籤的 [ 查詢類型] 群組中,按兩下 [ 資料定義]。
設計網格線會隱藏起來,並顯示 [SQL 檢視物件] 索引標籤。
-
輸入下列 SQL 語句:
ALTER TABLE Cars ALTER COLUMN 條件文字限制條件要求 NOT NULL
-
在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]。
現在假設過了一段時間后,您發現 [條件] 字段中有許多類似的值應該相同。 例如,有些車輛的「條件」值 不佳 ,有些則有 錯誤的值。
附註: 如果您想要遵循其餘的程式,請將一些假數據新增至您在上述步驟中建立的 [汽車] 數據表。
清除值使其更一致之後,您可以建立名為 CarCondition 的數據表,其中包含一個名為 [條件] 的欄位,其中包含您要用於汽車條件的所有值:
-
在 [ 建立] 索引 標籤 的 [宏 & 程式代碼 ] 群組中,按兩下 [查詢設計]。
-
在 [ 設計] 索引 標籤的 [ 查詢類型] 群組中,按兩下 [ 資料定義]。
設計網格線會隱藏起來,並顯示 [SQL 檢視物件] 索引標籤。
-
輸入下列 SQL 語句:
CREATE TABLE CarCondition (條件 TEXT (10) )
-
在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]。
-
使用 ALTER TABLE 語句建立資料表的主鍵:
ALTER TABLE CarCondition ALTER COLUMN 條件文字限制式 CarConditionPK PRIMARY 鍵
-
若要將 [汽車] 數據表 [條件] 字段中的值插入新的 CarCondition 數據表,請在 [SQL 檢視] 物件索引卷標中輸入下列 SQL:
INSERT INTO CarCondition SELECT DISTINCT Condition FROM Cars;
附註: 此步驟中的 SQL 語句是 新增查詢。 與數據定義查詢不同的是,追加查詢結尾是分號。
-
在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]。
使用限制式建立關聯
若要要求插入 [汽車] 數據表 [條件] 欄位的任何新值符合 CarCondition 數據表中 [條件] 字段的值,您可以使用下列程式,在名為 [條件] 的字段上建立 CarCondition 與 [汽車] 之間的關聯:
-
在 [ 建立] 索引 標籤 的 [宏 & 程式代碼 ] 群組中,按兩下 [查詢設計]。
-
在 [ 設計] 索引 標籤的 [ 查詢類型] 群組中,按兩下 [ 資料定義]。
設計網格線會隱藏起來,並顯示 [SQL 檢視物件] 索引標籤。
-
輸入下列 SQL 語句:
ALTER TABLE Cars ALTER COLUMN 條件文字限制式 FKeyCondition REFERENCES CarCondition (條件)
-
在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]。
多欄位限制式
多欄位 CONSTRAINT 子句只能在欄位定義子句之外使用,而且具有下列語法:
CONSTRAINT constraint_name
{PRIMARY KEY (pk_field1[, pk_field2[, ...]]) | UNIQUE (unique1[, unique2[, ...]]) | NOT NULL (notnull1[, notnull2[, ...]]) | FOREIGN KEY [NO INDEX] (ref_field1[, ref_field2[, ...]]) REFERENCES foreign_table [(fk_field1[, fk_field2[, ...]])] | [ON UPDATE {CASCADE | SET NULL}] [ON DELETE {CASCADE | SET NULL}]}
考慮使用 [汽車] 數據表的另一個範例。 假設您要確認 [汽車] 數據表中沒有兩筆記錄具有相同的 [名稱]、[年份]、[條件] 和 [價格] 值集合。 您可以使用下列程式建立適用於這些欄位的唯一限制式:
-
在 [ 建立] 索引 標籤 的 [宏 & 程式代碼 ] 群組中,按兩下 [查詢設計]。
-
在 [ 設計] 索引 標籤的 [ 查詢類型] 群組中,按兩下 [ 資料定義]。
設計網格線會隱藏起來,並顯示 [SQL 檢視物件] 索引標籤。
-
輸入下列 SQL 語句:
ALTER TABLE Cars ADD CONSTRAINT NoDupes UNIQUE (name, year, condition, price)
-
在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]。