使用資料定義查詢建立或修改資料表或索引

套用到
Microsoft 365 Access Access 2024 Access 2021 Access 2019 Access 2016

您可以在 [SQL 檢視] 中撰寫資料定義查詢,以在 Access 中建立及修改資料表、限制式、索引和關聯。 本文將說明資料定義查詢,以及如何使用這些查詢來建立資料表、限制式、索引和關聯。 本文也可以協助您決定何時使用資料定義查詢。

本文內容

概觀

不同於其他 Access 查詢,資料定義查詢不會擷取資料。 相反地,資料定義查詢會使用資料定義語言來建立、修改或刪除資料庫物件。

注意

資料定義語言 (DDL) 是結構化查詢語言 (SQL) (SQL) 的一部分。

資料定義查詢可能非常方便。 您可以只執行一些查詢,定期刪除及重新建立資料庫結構描述的部分。 如果您熟悉 SQL 陳述式,並打算刪除並重新建立特定的資料表、限制式、索引或關聯,請考慮使用資料定義查詢。

警告

使用資料定義查詢修改資料庫物件可能會有風險,因為動作不會伴隨確認對話方塊。 如果您出錯,可能會遺失資料,或不小心變更資料表的設計。 當您使用資料定義查詢修改資料庫中的物件時,請務必小心。 如果您不負責維護所使用的資料庫,您應先洽詢資料庫管理員,再執行資料定義查詢。

重要

在執行資料定義查詢之前,請先備份包含的任何資料表複本。

DDL 關鍵字

關鍵字 用途
CREATE 建立不存在的索引或資料表。
ALTER 修改現有的資料表或資料行。
DROP 刪除現有的資料表、資料行或限制式。
ADD 在資料表中新增資料行或限制式。
COLUMN 搭配 ADD、ALTER 或 DROP 使用
CONSTRAINT 搭配 ADD、ALTER 或 DROP 使用
INDEX 搭配 CREATE 使用
TABLE 搭配 ALTER、CREATE 或 DROP 使用

頁面頂端

建立或修改資料表

若要建立資料表,請使用 CREATE TABLE 命令。 CREATE TABLE 命令具有下列語法:

CREATE TABLE table_name 
 (field1 type [(size)] [NOT NULL] [index1]
 [, field2 type [(size)] [NOT NULL] [index2]
 [, ...][, CONSTRAINT constraint1 [, ...]])

CREATE TABLE 命令的唯一必要元素是 CREATE TABLE 命令本身和資料表名稱,但通常您會想要定義資料表的某些欄位或其他層面。 請考慮這個簡單的範例。

假設您想要建立資料表來儲存您考慮購買的二手車名稱、年份和價格。 您想要允許最多 30 個字元的名稱,以及 4 個字元的年份。 若要使用資料定義查詢建立資料表,請執行下列動作:

注意

您可能需要先啟用資料庫的內容,資料定義查詢才能執行:

  • 在 [訊息列] 上,按一下 [啟用內容]

建立表格

  1. [建立] 索引標籤上,按一下 [巨集與程式碼] 群組中的 [查詢設計]
  2. [設計] 索引標籤上,按一下 [查詢類型] 群組中的 [資料定義]
    設計格線會隱藏起來,而顯示 [SQL 檢視物件] 索引標籤。
  3. 輸入下列 SQL 陳述式:
    CREATE TABLE Cars (Name TEXT(30), Year TEXT(4), Price CURRENCY)
  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 個字元的文字欄位,以儲存每一輛車的狀況資訊。 您可以執行下列動作:

  1. [建立] 索引標籤上,按一下 [巨集與程式碼] 群組中的 [查詢設計]
  2. [設計] 索引標籤上,按一下 [查詢類型] 群組中的 [資料定義]
    設計格線會隱藏起來,而顯示 [SQL 檢視物件] 索引標籤。
  3. 輸入下列 SQL 陳述式:
    ALTER TABLE Cars ADD COLUMN Condition TEXT(10)
  4. 在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]

頁面頂端

建立索引

若要在現有資料表上建立索引,請使用 CREATE INDEX 命令。 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 值。

假設您有一個名為 [汽車] 的資料表,其中包含儲存您考慮購買的二手車名稱、年份、價格和狀況的欄位。 此外,假設資料表已經變得很大,而且您經常在查詢中包含年份欄位。 您可以在 [年份] 欄位上建立索引,以使用下列程序協助查詢更快速地傳回結果:

  1. [建立] 索引標籤上,按一下 [巨集與程式碼] 群組中的 [查詢設計]
  2. [設計] 索引標籤上,按一下 [查詢類型] 群組中的 [資料定義]
    設計格線會隱藏起來,而顯示 [SQL 檢視物件] 索引標籤。
  3. 輸入下列 SQL 陳述式:
    CREATE INDEX YearIndex ON Cars (Year)
  4. 在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]

頁面頂端

建立限制式或關聯

限制式會建立一個邏輯條件,用來規定在插入值時,欄位或欄位組合必須符合的條件。 例如,UNIQUE 限制式可防止受限制的欄位接受與該欄位的現有值重複的值。

關聯是一種限制式類型,它會參照另一個資料表中的欄位或欄位組合的值,以判斷是否可以在受限的欄位或欄位組合中插入某個值。 您不需要使用特別的關鍵字來表明限制式是一種關聯。

若要建立限制式,請在 CREATE TABLE 或 ALTER TABLE 命令中使用 CONSTRAINT 子句。 CONTRAINT 子句有兩種類型:一種用來在單一欄位建立限制式,另一種則用於在多個欄位建立限制式。

單一欄位限制式

單一欄位 CONSTRAINT 子句會立即遵循其限制的欄位定義,並具有下列語法:

CONSTRAINT constraint_name {PRIMARY KEY | UNIQUE | NOT NULL |
 REFERENCES foreign_table [(foreign_field)]
 [ON UPDATE {CASCADE | SET NULL}]
 [ON DELETE {CASCADE | SET NULL}]}

假設您有一個名為 [汽車] 的資料表,其中包含儲存您考慮購買的二手車名稱、年份、價格和狀況的欄位。 同時假設您經常忘記輸入汽車狀況的值,而您又希望每次都記錄這項資訊。 您可以使用下列程序,在 [狀況] 欄位上建立限制式,避免該欄位空白:

  1. [建立] 索引標籤上,按一下 [巨集與程式碼] 群組中的 [查詢設計]
  2. [設計] 索引標籤上,按一下 [查詢類型] 群組中的 [資料定義]
    設計格線會隱藏起來,而顯示 [SQL 檢視物件] 索引標籤。
  3. 輸入下列 SQL 陳述式:
    ALTER TABLE Cars ALTER COLUMN Condition TEXT CONSTRAINT ConditionRequired NOT NULL
  4. 在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]

現在假設,過了一段時間後,您發現 [狀況] 欄位中有許多相似但應該相同的值。 例如,有些汽車的 [狀況] 欄位值是 [不佳],而有些則是 [差],但這兩者其實應該代表相同的狀況。

注意

如果您想繼續執行剩餘的程序,請在您在之前步驟中建立的 [汽車] 資料表中新增一些虛假資料。

清除值使其更一致之後,您可以建立名為 CarCondition 的資料表,其中包含一個名為 [狀況] 的欄位,其中包含您要用於汽車狀況的所有值:

  1. [建立] 索引標籤上,按一下 [巨集與程式碼] 群組中的 [查詢設計]

  2. [設計] 索引標籤上,按一下 [查詢類型] 群組中的 [資料定義]
    設計格線會隱藏起來,而顯示 [SQL 檢視物件] 索引標籤。

  3. 輸入下列 SQL 陳述式:
    CREATE TABLE CarCondition (Condition TEXT(10))

  4. 在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]

  5. 使用 ALTER TABLE 陳述式建立資料表的主索引鍵:
    ALTER TABLE CarCondition ALTER COLUMN Condition TEXT CONSTRAINT CarConditionPK PRIMARY KEY

  6. 若要將 [汽車] 資料表 [狀況] 欄位中的值插入新的 CarCondition 資料表,請在 [SQL 檢視] 物件索引標籤中輸入下列 SQL:
    INSERT INTO CarCondition SELECT DISTINCT Condition FROM Cars;

    注意

    此步驟中的 SQL 陳述式是附加查詢。 與資料定義查詢不同的是,新增查詢會以分號結尾。

  7. 在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]

使用限制式建立關聯

若要要求插入 [汽車] 資料表 [狀況] 欄位的任何新值符合 CarCondition 資料表中 [狀況] 欄位的值,您可以使用下列程序,在名為 [狀況] 的欄位上建立 CarCondition 與 [汽車] 之間的關聯:

  1. [建立] 索引標籤上,按一下 [巨集與程式碼] 群組中的 [查詢設計]
  2. [設計] 索引標籤上,按一下 [查詢類型] 群組中的 [資料定義]
    設計格線會隱藏起來,而顯示 [SQL 檢視物件] 索引標籤。
  3. 輸入下列 SQL 陳述式:
    ALTER TABLE Cars ALTER COLUMN Condition TEXT CONSTRAINT FKeyCondition REFERENCES CarCondition (Condition)
  4. 在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]

多欄位限制式

多欄位 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}]}

考慮使用 [汽車] 資料表的另一個範例。 假設您要確認 [汽車] 資料表中沒有兩筆記錄具有相同的 [名稱]、[年份]、[狀況] 和 [價格] 值集合。 您可以使用下列程序建立適用於這些欄位的 UNIQUE 限制式:

  1. [建立] 索引標籤上,按一下 [巨集與程式碼] 群組中的 [查詢設計]
  2. [設計] 索引標籤上,按一下 [查詢類型] 群組中的 [資料定義]
    設計格線會隱藏起來,而顯示 [SQL 檢視物件] 索引標籤。
  3. 輸入下列 SQL 陳述式:
    ALTER TABLE Cars ADD CONSTRAINT NoDupes UNIQUE (name, year, condition, price)
  4. 在 [設計] 索引標籤上的 [結果] 群組中,按一下 [執行]

頁面頂端