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