可以通过在 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 命令。 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 个字符。 要使用数据定义查询创建表,请执行下列操作:
注意
您可能首先需要启用数据库的内容才能运行数据定义查询:
- 在消息栏,单击“启用内容”。
创建表
- 在 “创建 ”选项卡的“ 宏”&“代码 ”组中,单击 “查询设计”。
- 在 “设计 ”选项卡的 “查询类型 ”组中,单击 “数据定义”。
设计网格处于隐藏状态,显示“SQL 视图对象”选项卡。 - 键入以下 SQL 语句:
CREATE TABLE Cars (Name TEXT (30) , Year TEXT (4) , Price CURRENCY) - 在“设计”选项卡上的“结果”组中,单击“运行”。
修改表格
若要修改表,请使用 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 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 值。
假设您有一个名为 Cars 的表,其中包含存储您考虑购买的二手车的名称、年份、价格和状况的字段。 还假定表变得很大,并且您经常在查询中包含年份字段。 可以通过使用以下过程在“年份”字段上创建索引,以帮助查询更快地返回结果:
- 在 “创建 ”选项卡的“ 宏”&“代码 ”组中,单击 “查询设计”。
- 在 “设计 ”选项卡的 “查询类型 ”组中,单击 “数据定义”。
设计网格处于隐藏状态,显示“SQL 视图对象”选项卡。 - 键入以下 SQL 语句:
CREATE INDEX YearIndex ON 汽车 (年份) - 在“设计”选项卡上的“结果”组中,单击“运行”。
创建约束或关系
约束建立插入值时字段或字段组合必须满足的逻辑条件。 例如,UNIQUE 约束阻止受约束字段接受将复制该字段的现有值的值。
关系是一种约束,它引用另一个表中字段或字段组合的值,以确定是否可以在受约束字段或字段组合中插入值。 请勿使用特殊关键字 (keyword) 来指示约束是关系。
要创建约束,请在 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}]}
假设您有一个名为 Cars 的表,其中包含存储您考虑购买的二手车的名称、年份、价格和状况的字段。 还假设您经常忘记输入汽车状况的值,并且您总是想记录此信息。 您可以使用以下过程对“条件”字段创建阻止将字段留空的约束:
- 在 “创建 ”选项卡的“ 宏”&“代码 ”组中,单击 “查询设计”。
- 在 “设计 ”选项卡的 “查询类型 ”组中,单击 “数据定义”。
设计网格处于隐藏状态,显示“SQL 视图对象”选项卡。 - 键入以下 SQL 语句:
ALTER TABLE Cars ALTER COLUMN Condition TEXT CONSTRAINT ConditionRequired NOT NULL - 在“设计”选项卡上的“结果”组中,单击“运行”。
现在假设一段时间后,您注意到“条件”字段中有许多应相同的相似值。 例如,某些汽车的“状况”值为 “差” ,而其他汽车的“状况”值为 “差”。
注意
如果要执行其余步骤,请将一些假数据添加到前面步骤中创建的 Cars 表中。
清理值以使其更加一致后,可以创建一个名为 CarCondition 的表,其中包含一个名为 Condition 的字段,其中包含要用于汽车状况的所有值:
在 “创建 ”选项卡的“ 宏”&“代码 ”组中,单击 “查询设计”。
在 “设计 ”选项卡的 “查询类型 ”组中,单击 “数据定义”。
设计网格处于隐藏状态,显示“SQL 视图对象”选项卡。键入以下 SQL 语句:
CREATE TABLE CarCondition (Condition TEXT (10) )在“设计”选项卡上的“结果”组中,单击“运行”。
使用 ALTER TABLE 语句为表创建主键:
ALTER TABLE CarCondition ALTER COLUMN Condition TEXT CONSTRAINT CarConditionPK PRIMARY KEY若要将 Cars 表的 Condition 字段中的值插入新的 CarCondition 表中,请在 SQL 视图对象选项卡中键入以下 SQL:
INSERT INTO CarCondition SELECT DISTINCT Condition FROM Cars;注意
此步骤中的 SQL 语句是追加查询。 与数据定义查询不同,追加查询以分号结尾。
在“设计”选项卡上的“结果”组中,单击“运行”。
使用约束创建关系
若要要求在 Cars 表的 Condition 字段中插入的任何新值与 CarCondition 表中 Condition 字段的值相匹配,可以使用以下过程在名为 Condition 的字段上创建 CarCondition 和 Cars 之间的关系:
- 在 “创建 ”选项卡的“ 宏”&“代码 ”组中,单击 “查询设计”。
- 在 “设计 ”选项卡的 “查询类型 ”组中,单击 “数据定义”。
设计网格处于隐藏状态,显示“SQL 视图对象”选项卡。 - 键入以下 SQL 语句:
ALTER TABLE Cars ALTER COLUMN Condition TEXT CONSTRAINT FKeyCondition 参考 CarCondition (Condition) - 在“设计”选项卡上的“结果”组中,单击“运行”。
多字段约束
多字段 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}]}
考虑另一个使用 Cars 表的示例。 假定您希望确保 Cars 表中没有两条记录具有相同的 Name、Year、Condition 和 Price 值集。 通过使用以下过程,可以创建应用于这些字段的唯一约束:
- 在 “创建 ”选项卡的“ 宏”&“代码 ”组中,单击 “查询设计”。
- 在 “设计 ”选项卡的 “查询类型 ”组中,单击 “数据定义”。
设计网格处于隐藏状态,显示“SQL 视图对象”选项卡。 - 键入以下 SQL 语句:
ALTER TABLE Cars ADD CONSTRAINT NoDupes UNIQUE (name, year, condition, price) - 在“设计”选项卡上的“结果”组中,单击“运行”。