使用数据定义查询创建或修改表或索引
可以通过在 SQL 视图中编写数据定义查询来创建和修改表、限制、索引和关系。
本文介绍了数据定义查询,以及如何使用此类查询创建表、限制、索引及关系。本文还可以帮助您决定何时使用数据定义查询。
注释 在 Web 数据库中无法使用这些过程。
本文内容
和其他查询不同,数据定义查询不检索数据,而是使用数据定义语言创建、修改或删除数据库对象。
注释 数据定义语言 (DDL) 属于结构化查询语言 (SQL)。
数据定义查询非常方便,只需运行几次查询即可定期删除和重新创建您的部分数据库架构。如果您熟悉 SQL 语句并计划删除和重新创建特殊的表、限制、索引或关系,可以考虑使用数据定义查询。
警告 使用数据定义查询来修改数据库对象可能会有风险,因为完成操作时并不出现确认对话框。如果操作出错,可能造成数据丢失或意外更改表的设计。使用数据定义查询来修改数据库中的对象时要格外小心。如果您所使用的数据库不是由您来负责维护的,应当在运行数据定义查询之前咨询数据库的管理员。
要点 在运行数据定义查询之前,请备份所有相关的表。
关键字 |
用途 |
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. | 关闭“显示表”对话框。 |
3. | 在“设计”选项卡上的“查询类型”组中,单击“数据定义”。 |
将隐藏设计网格并显示 SQL 视图对象选项卡。
4. | 键入以下 SQL 语句: |
CREATE TABLE Cars (Name TEXT(30), Year TEXT(4), Price CURRENCY)
5. | 在“设计”选项卡上的“结果”组中,单击“运行”。 |
要修改表,请使用 ALTER TABLE 命令。使用 ALTER TABLE 命令可添加、修改或删除列或限制。ALTER TABLE 命令的语法如下:
ALTER TABLE table_name predicate
其中 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. | 关闭“显示表”对话框。 |
3. | 在“设计”选项卡上的“查询类型”组中,单击“数据定义”。 |
将隐藏设计网格并显示 SQL 视图对象选项卡。
4. | 键入以下 SQL 语句: |
ALTER TABLE Cars ADD COLUMN Condition TEXT(10)
5. | 在“设计”选项卡上的“结果”组中,单击“运行”。 |
要对现有表创建索引,可以使用 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 参数将索引的字段作为表的主键 (主键:具有唯一标识表中每条记录的值的一个或多个域(列)。主键不允许为 NULL,并且必须始终具有唯一索引。主键用来将表与其他表中的外键相关联。)。 |
✍ | WITH DISALLOW NULL 参数使索引要求对索引的字段输入值,即不允许为空值。 |
假设您有一个名称为 Cars 的表,其中的字段用于存储您打算购买的二手车的名称、年份、价格和状况。另外假设该表变得很大,您经常在查询中包含年份字段。您可以使用以下过程对年份字段创建一个索引,以帮助查询更快地返回结果:
1. | 在“创建”选项卡上的“宏与代码”组中,单击“查询设计”。 |
2. | 关闭“显示表”对话框。 |
3. | 在“设计”选项卡上的“查询类型”组中,单击“数据定义”。 |
将隐藏设计网格并显示 SQL 视图对象选项卡。
4. | 键入以下 SQL 语句: |
CREATE INDEX YearIndex ON Cars (Year)
5. | 在“设计”选项卡上的“结果”组中,单击“运行”。 |
限制建立了当插入值时字段或字段组合必须满足的逻辑条件。例如,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}]}
假设您有一个名称为 Cars 的表,其中的字段用于存储您打算购买的二手车的名称、年份、价格和状况。另外假设您经常忘记输入汽车状况的值,并且始终需要记录此信息。您可以使用以下过程对 Condition 字段创建一个限制,以防止您将该字段保持为空:
1. | 在“创建”选项卡上的“宏与代码”组中,单击“查询设计”。 |
2. | 关闭“显示表”对话框。 |
3. | 在“设计”选项卡上的“查询类型”组中,单击“数据定义”。 |
将隐藏设计网格并显示 SQL 视图对象选项卡。
4. | 键入以下 SQL 语句: |
ALTER TABLE Cars ALTER COLUMN Condition TEXT CONSTRAINT ConditionRequired NOT NULL
5. | 在“设计”选项卡上的“结果”组中,单击“运行”。 |
现在假设稍后您注意到 Condition 字段中存在许多相似的值,而这些值应该是相同的。例如,一些汽车的 Condition 值为 poor,其他汽车的值为 bad。
注释 如果想要接着执行剩余的过程,请向您在上述步骤中创建的 Cars 表中添加一些伪造数据。
当清除这些值以便它们更加一致后,您可以创建一个名为 CarCondition 的表,其中有一个名为 Condition 的字段,该字段包含您要对汽车状况使用的所有值:
1. | 在“创建”选项卡上的“宏与代码”组中,单击“查询设计”。 |
2. | 关闭“显示表”对话框。 |
3. | 在“设计”选项卡上的“查询类型”组中,单击“数据定义”。 |
将隐藏设计网格并显示 SQL 视图对象选项卡。
4. | 键入以下 SQL 语句: |
CREATE TABLE CarCondition (Condition TEXT(10))
5. | 在“设计”选项卡上的“结果”组中,单击“运行”。 |
6. | 使用 ALTER TABLE 语句为该表创建一个主键: |
ALTER TABLE CarCondition ALTER COLUMN Condition TEXT CONSTRAINT CarConditionPK PRIMARY KEY
7. | 要将 Cars 表的 Condition 字段中的值插入到新的 CarCondition 表中,请在 SQL 视图对象选项卡中键入以下 SQL 语句: |
INSERT INTO CarCondition SELECT DISTINCT Condition FROM Cars;
注释 此步骤中的 SQL 语句是一个追加查询 (追加查询:一种动作查询,它将查询结果集内的记录添加到现有表的尾部。)。与数据定义查询不同,追加查询以分号结尾。
8. | 在“设计”选项卡上的“结果”组中,单击“运行”。 |
为了要求在 Cars 表的 Condition 字段中输入的值与 CarCondition 表的 Condition 字段的值相匹配,您可以使用以下过程在名为 Condition 字段中创建 CarCondition 与 Cars 之间的关系:
1. | 在“创建”选项卡上的“宏与代码”组中,单击“查询设计”。 |
2. | 关闭“显示表”对话框。 |
3. | 在“设计”选项卡上的“查询类型”组中,单击“数据定义”。 |
将隐藏设计网格并显示 SQL 视图对象选项卡。
4. | 键入以下 SQL 语句: |
ALTER TABLE Cars ALTER COLUMN Condition TEXT CONSTRAINT FKeyCondition REFERENCES CarCondition (Condition)
5. | 在“设计”选项卡上的“结果”组中,单击“运行”。 |
多字段 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 表中不会出现其名称、年份、状况和价格的值都相同的两条记录。您可以使用下面的过程创建应用于这些字段的 UNIQUE 限制:
1. | 在“创建”选项卡上的“宏与代码”组中,单击“查询设计”。 |
2. | 关闭“显示表”对话框。 |
3. | 在“设计”选项卡上的“查询类型”组中,单击“数据定义”。 |
将隐藏设计网格并显示 SQL 视图对象选项卡。
4. | 键入以下 SQL 语句: |
ALTER TABLE Cars ADD CONSTRAINT NoDupes UNIQUE (name, year, condition, price)
5. | 在“设计”选项卡上的“结果”组中,单击“运行”。 |
请参阅