Access > 設(shè)計(jì)應(yīng)用程序
使用數(shù)據(jù)定義查詢創(chuàng)建或修改表或索引
可以通過(guò)在 SQL 視圖中編寫(xiě)數(shù)據(jù)定義查詢來(lái)創(chuàng)建和修改表、限制、索引和關(guān)系。
本文介紹了數(shù)據(jù)定義查詢,以及如何使用此類查詢創(chuàng)建表、限制、索引及關(guān)系。本文還可以幫助您決定何時(shí)使用數(shù)據(jù)定義查詢。
注釋 在 Web 數(shù)據(jù)庫(kù)中無(wú)法使用這些過(guò)程。
本文內(nèi)容
和其他查詢不同,數(shù)據(jù)定義查詢不檢索數(shù)據(jù),而是使用數(shù)據(jù)定義語(yǔ)言創(chuàng)建、修改或刪除數(shù)據(jù)庫(kù)對(duì)象。
注釋 數(shù)據(jù)定義語(yǔ)言 (DDL) 屬于結(jié)構(gòu)化查詢語(yǔ)言 (SQL)。
數(shù)據(jù)定義查詢非常方便,只需運(yùn)行幾次查詢即可定期刪除和重新創(chuàng)建您的部分?jǐn)?shù)據(jù)庫(kù)架構(gòu)。如果您熟悉 SQL 語(yǔ)句并計(jì)劃刪除和重新創(chuàng)建特殊的表、限制、索引或關(guān)系,可以考慮使用數(shù)據(jù)定義查詢。
警告 使用數(shù)據(jù)定義查詢來(lái)修改數(shù)據(jù)庫(kù)對(duì)象可能會(huì)有風(fēng)險(xiǎn),因?yàn)橥瓿刹僮鲿r(shí)并不出現(xiàn)確認(rèn)對(duì)話框。如果操作出錯(cuò),可能造成數(shù)據(jù)丟失或意外更改表的設(shè)計(jì)。使用數(shù)據(jù)定義查詢來(lái)修改數(shù)據(jù)庫(kù)中的對(duì)象時(shí)要格外小心。如果您所使用的數(shù)據(jù)庫(kù)不是由您來(lái)負(fù)責(zé)維護(hù)的,應(yīng)當(dāng)在運(yùn)行數(shù)據(jù)定義查詢之前咨詢數(shù)據(jù)庫(kù)的管理員。
要點(diǎn) 在運(yùn)行數(shù)據(jù)定義查詢之前,請(qǐng)備份所有相關(guān)的表。
關(guān)鍵字 |
用途 |
CREATE |
創(chuàng)建一個(gè)尚不存在的索引或表。 |
ALTER |
修改現(xiàn)有的表或列。 |
DROP |
刪除現(xiàn)有的表、列或限制。 |
ADD |
向表中添加列或限制。 |
COLUMN |
與 ADD、ALTER 或 DROP 配合使用 |
CONSTRAINT |
與 ADD、ALTER 或 DROP 配合使用 |
INDEX |
與 CREATE 配合使用 |
TABLE |
與 ALTER、CREATE 或 DROP 配合使用 |
要?jiǎng)?chuàng)建表,可以使用 CREATE TABLE 命令。CREATE TABLE 命令的語(yǔ)法如下:
CREATE TABLE table_name
(field1 type [(size)] [NOT NULL] [index1]
[, field2 type [(size)] [NOT NULL] [index2]
[, ...][, CONSTRAINT constraint1 [, ...]])
CREATE TABLE 命令的必要元素只有 CREATE TABLE 命令本身和表名稱,但通常需要定義表的某些字段或其他部分。請(qǐng)考慮下面的簡(jiǎn)單示例。
假設(shè)您要?jiǎng)?chuàng)建表來(lái)存儲(chǔ)正在打算購(gòu)買的二手車的名稱、年份及價(jià)格。名稱最多包含 30 個(gè)字符,年份最多包含 4 個(gè)字符。要使用數(shù)據(jù)定義查詢創(chuàng)建表,操作如下:
注釋 可能需要先啟用數(shù)據(jù)庫(kù)的內(nèi)容,然后才能運(yùn)行數(shù)據(jù)定義查詢:
✍ | 在消息欄中,單擊“啟用內(nèi)容”。 |
1. | 在“創(chuàng)建”選項(xiàng)卡上的“宏與代碼”組中,單擊“查詢?cè)O(shè)計(jì)”。 |
2. | 關(guān)閉“顯示表”對(duì)話框。 |
3. | 在“設(shè)計(jì)”選項(xiàng)卡上的“查詢類型”組中,單擊“數(shù)據(jù)定義”。 |
將隱藏設(shè)計(jì)網(wǎng)格并顯示 SQL 視圖對(duì)象選項(xiàng)卡。
4. | 鍵入以下 SQL 語(yǔ)句: |
CREATE TABLE Cars (Name TEXT(30), Year TEXT(4), Price CURRENCY)
5. | 在“設(shè)計(jì)”選項(xiàng)卡上的“結(jié)果”組中,單擊“運(yùn)行”。 |
要修改表,請(qǐng)使用 ALTER TABLE 命令。使用 ALTER TABLE 命令可添加、修改或刪除列或限制。ALTER TABLE 命令的語(yǔ)法如下:
ALTER TABLE table_name predicate
其中 predicate 可以是下列任意一項(xiàng):
✍ |
ADD COLUMN field type[(size)] [NOT NULL] [CONSTRAINT constraint]
✍ |
ADD CONSTRAINT multifield_constraint
✍ |
ALTER COLUMN field type[(size)]
✍ |
DROP COLUMN field
✍ |
DROP CONSTRAINT constraint
假設(shè)您要添加 10 個(gè)字符的文本字段來(lái)存儲(chǔ)有關(guān)每輛車的狀況信息。您可以執(zhí)行下列操作:
1. | 在“創(chuàng)建”選項(xiàng)卡上的“宏與代碼”組中,單擊“查詢?cè)O(shè)計(jì)”。 |
2. | 關(guān)閉“顯示表”對(duì)話框。 |
3. | 在“設(shè)計(jì)”選項(xiàng)卡上的“查詢類型”組中,單擊“數(shù)據(jù)定義”。 |
將隱藏設(shè)計(jì)網(wǎng)格并顯示 SQL 視圖對(duì)象選項(xiàng)卡。
4. | 鍵入以下 SQL 語(yǔ)句: |
ALTER TABLE Cars ADD COLUMN Condition TEXT(10)
5. | 在“設(shè)計(jì)”選項(xiàng)卡上的“結(jié)果”組中,單擊“運(yùn)行”。 |
要對(duì)現(xiàn)有表創(chuàng)建索引,可以使用 CREATE INDEX 命令。CREATE INDEX 命令的語(yǔ)法如下:
CREATE [UNIQUE] INDEX index_name
ON table (field1 [DESC][, field2 [DESC], ...])
[WITH {PRIMARY | DISALLOW NULL | IGNORE NULL}]
必需的元素只有 CREATE INDEX 命令、索引的名稱、ON 參數(shù)、包含要編入索引的字段的表名稱,以及要包含在索引中的字段列表。
✍ | DESC 參數(shù)使索引按降序創(chuàng)建,在您經(jīng)常運(yùn)行查找索引字段高值的查詢或按降序?qū)λ饕淖侄芜M(jìn)行排序時(shí),這非常有用。默認(rèn)情況下,索引按升序創(chuàng)建。 |
✍ | WITH PRIMARY 參數(shù)將索引的字段作為表的主鍵 (主鍵:具有唯一標(biāo)識(shí)表中每條記錄的值的一個(gè)或多個(gè)域(列)。主鍵不允許為 NULL,并且必須始終具有唯一索引。主鍵用來(lái)將表與其他表中的外鍵相關(guān)聯(lián)。)。 |
✍ | WITH DISALLOW NULL 參數(shù)使索引要求對(duì)索引的字段輸入值,即不允許為空值。 |
假設(shè)您有一個(gè)名稱為 Cars 的表,其中的字段用于存儲(chǔ)您打算購(gòu)買的二手車的名稱、年份、價(jià)格和狀況。另外假設(shè)該表變得很大,您經(jīng)常在查詢中包含年份字段。您可以使用以下過(guò)程對(duì)年份字段創(chuàng)建一個(gè)索引,以幫助查詢更快地返回結(jié)果:
1. | 在“創(chuàng)建”選項(xiàng)卡上的“宏與代碼”組中,單擊“查詢?cè)O(shè)計(jì)”。 |
2. | 關(guān)閉“顯示表”對(duì)話框。 |
3. | 在“設(shè)計(jì)”選項(xiàng)卡上的“查詢類型”組中,單擊“數(shù)據(jù)定義”。 |
將隱藏設(shè)計(jì)網(wǎng)格并顯示 SQL 視圖對(duì)象選項(xiàng)卡。
4. | 鍵入以下 SQL 語(yǔ)句: |
CREATE INDEX YearIndex ON Cars (Year)
5. | 在“設(shè)計(jì)”選項(xiàng)卡上的“結(jié)果”組中,單擊“運(yùn)行”。 |
限制建立了當(dāng)插入值時(shí)字段或字段組合必須滿足的邏輯條件。例如,UNIQUE 限制禁止受限制的字段接受與該字段的現(xiàn)有值相同的值。
關(guān)系是一種限制,它引用另一個(gè)表中的字段或字段組合的值,以確定某個(gè)值是否可以插入受限制的字段或字段組合中。您不需要使用特殊的關(guān)鍵字來(lái)表明限制是一種關(guān)系。
要?jiǎng)?chuàng)建限制,請(qǐng)?jiān)凇癈REATE TABLE”或“ALTER TABLE”命令中使用 CONSTRAINT 子句。有兩種 CONSTRAINT 子句:一種用于對(duì)單個(gè)字段創(chuàng)建限制,另一種用于對(duì)多個(gè)字段創(chuàng)建限制。
單個(gè)字段 CONSTRAINT 子句緊跟在它所限制的字段定義之后,其語(yǔ)法如下:
CONSTRAINT constraint_name {PRIMARY KEY | UNIQUE |
NOT NULL | REFERENCES foreign_table [(foreign_field)]
[ON UPDATE {CASCADE | SET NULL}]
[ON DELETE {CASCADE | SET NULL}]}
假設(shè)您有一個(gè)名稱為 Cars 的表,其中的字段用于存儲(chǔ)您打算購(gòu)買的二手車的名稱、年份、價(jià)格和狀況。另外假設(shè)您經(jīng)常忘記輸入汽車狀況的值,并且始終需要記錄此信息。您可以使用以下過(guò)程對(duì) Condition 字段創(chuàng)建一個(gè)限制,以防止您將該字段保持為空:
1. | 在“創(chuàng)建”選項(xiàng)卡上的“宏與代碼”組中,單擊“查詢?cè)O(shè)計(jì)”。 |
2. | 關(guān)閉“顯示表”對(duì)話框。 |
3. | 在“設(shè)計(jì)”選項(xiàng)卡上的“查詢類型”組中,單擊“數(shù)據(jù)定義”。 |
將隱藏設(shè)計(jì)網(wǎng)格并顯示 SQL 視圖對(duì)象選項(xiàng)卡。
4. | 鍵入以下 SQL 語(yǔ)句: |
ALTER TABLE Cars ALTER COLUMN Condition TEXT CONSTRAINT ConditionRequired NOT NULL
5. | 在“設(shè)計(jì)”選項(xiàng)卡上的“結(jié)果”組中,單擊“運(yùn)行”。 |
現(xiàn)在假設(shè)稍后您注意到 Condition 字段中存在許多相似的值,而這些值應(yīng)該是相同的。例如,一些汽車的 Condition 值為 poor,其他汽車的值為 bad。
注釋 如果想要接著執(zhí)行剩余的過(guò)程,請(qǐng)向您在上述步驟中創(chuàng)建的 Cars 表中添加一些偽造數(shù)據(jù)。
當(dāng)清除這些值以便它們更加一致后,您可以創(chuàng)建一個(gè)名為 CarCondition 的表,其中有一個(gè)名為 Condition 的字段,該字段包含您要對(duì)汽車狀況使用的所有值:
1. | 在“創(chuàng)建”選項(xiàng)卡上的“宏與代碼”組中,單擊“查詢?cè)O(shè)計(jì)”。 |
2. | 關(guān)閉“顯示表”對(duì)話框。 |
3. | 在“設(shè)計(jì)”選項(xiàng)卡上的“查詢類型”組中,單擊“數(shù)據(jù)定義”。 |
將隱藏設(shè)計(jì)網(wǎng)格并顯示 SQL 視圖對(duì)象選項(xiàng)卡。
4. | 鍵入以下 SQL 語(yǔ)句: |
CREATE TABLE CarCondition (Condition TEXT(10))
5. | 在“設(shè)計(jì)”選項(xiàng)卡上的“結(jié)果”組中,單擊“運(yùn)行”。 |
6. | 使用 ALTER TABLE 語(yǔ)句為該表創(chuàng)建一個(gè)主鍵: |
ALTER TABLE CarCondition ALTER COLUMN Condition TEXT CONSTRAINT CarConditionPK PRIMARY KEY
7. | 要將 Cars 表的 Condition 字段中的值插入到新的 CarCondition 表中,請(qǐng)?jiān)?SQL 視圖對(duì)象選項(xiàng)卡中鍵入以下 SQL 語(yǔ)句: |
INSERT INTO CarCondition SELECT DISTINCT Condition FROM Cars;
注釋 此步驟中的 SQL 語(yǔ)句是一個(gè)追加查詢 (追加查詢:一種動(dòng)作查詢,它將查詢結(jié)果集內(nèi)的記錄添加到現(xiàn)有表的尾部。)。與數(shù)據(jù)定義查詢不同,追加查詢以分號(hào)結(jié)尾。
8. | 在“設(shè)計(jì)”選項(xiàng)卡上的“結(jié)果”組中,單擊“運(yùn)行”。 |
為了要求在 Cars 表的 Condition 字段中輸入的值與 CarCondition 表的 Condition 字段的值相匹配,您可以使用以下過(guò)程在名為 Condition 字段中創(chuàng)建 CarCondition 與 Cars 之間的關(guān)系:
1. | 在“創(chuàng)建”選項(xiàng)卡上的“宏與代碼”組中,單擊“查詢?cè)O(shè)計(jì)”。 |
2. | 關(guān)閉“顯示表”對(duì)話框。 |
3. | 在“設(shè)計(jì)”選項(xiàng)卡上的“查詢類型”組中,單擊“數(shù)據(jù)定義”。 |
將隱藏設(shè)計(jì)網(wǎng)格并顯示 SQL 視圖對(duì)象選項(xiàng)卡。
4. | 鍵入以下 SQL 語(yǔ)句: |
ALTER TABLE Cars ALTER COLUMN Condition TEXT CONSTRAINT FKeyCondition REFERENCES CarCondition (Condition)
5. | 在“設(shè)計(jì)”選項(xiàng)卡上的“結(jié)果”組中,單擊“運(yùn)行”。 |
多字段 CONSTRAINT 子句只能在字段定義子句之外使用,其語(yǔ)法如下:
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}]}
請(qǐng)考慮使用 Cars 表的另一個(gè)示例。假設(shè)您要確保 Cars 表中不會(huì)出現(xiàn)其名稱、年份、狀況和價(jià)格的值都相同的兩條記錄。您可以使用下面的過(guò)程創(chuàng)建應(yīng)用于這些字段的 UNIQUE 限制:
1. | 在“創(chuàng)建”選項(xiàng)卡上的“宏與代碼”組中,單擊“查詢?cè)O(shè)計(jì)”。 |
2. | 關(guān)閉“顯示表”對(duì)話框。 |
3. | 在“設(shè)計(jì)”選項(xiàng)卡上的“查詢類型”組中,單擊“數(shù)據(jù)定義”。 |
將隱藏設(shè)計(jì)網(wǎng)格并顯示 SQL 視圖對(duì)象選項(xiàng)卡。
4. | 鍵入以下 SQL 語(yǔ)句: |
ALTER TABLE Cars ADD CONSTRAINT NoDupes UNIQUE (name, year, condition, price)
5. | 在“設(shè)計(jì)”選項(xiàng)卡上的“結(jié)果”組中,單擊“運(yùn)行”。 |
請(qǐng)參閱