结构化查询语言/数据定义语言
数据定义语言用于修改数据库的模式。它永远不会影响数据库的用户权限。否则,它可能会擦除某些表中的记录。它描述了三个语句:CREATE、ALTER 和 DROP。
表 CREATE 语句的完整语法如下所示
CREATE TABLE <table name>
(<column name> <column type>[ NOT NULL][ PRIMARY KEY| DEFAULT <value>][, <column name> <column type>[ NOT NULL][ PRIMARY KEY| DEFAULT <value>]]*
[,[ CONSTRAINT <constraint name>]
{
PRIMARY KEY (<column name>[, <column name>]*)
|
UNIQUE ([VALUE|<column name>[, <column name>]*])
|
FOREIGN KEY (<column name>[, <column name>]*) REFERENCES <table name> (<column name>[, <column name>]*)[ ON DELETE CASCADE][ ON UPDATE CASCADE]
|
CHECK (<predicate>[{ AND| OR} <predicate>]*)
}
]*
);
CREATE 语句用于创建一个没有记录的新表。让我们创建名为 office
的表。office
表中的记录将包含一个技术 ID、办公室名称、描述、可用位置数量、可用性和下次办公室安全控制的日期
- 查询:
CREATE TABLE office
(
id_office INTEGER PRIMARY KEY NOT NULL,
name VARCHAR(20) NOT NULL,
description VARCHAR(255),
place_number INTEGER NOT NULL,
available SMALLINT NOT NULL DEFAULT 1,
next_inspection DATE NOT NULL
);
- 语句后的表:
id_office | INTEGER |
name | VARCHAR(20) |
description | VARCHAR(255) |
place_number | INTEGER |
available | SMALLINT |
next_inspection | DATE |
现在可以像使用 reunion
、employee
、project
和 members
表一样使用和填充 office
表了
id_office | name | description | place_number | available | next_inspection |
---|---|---|---|---|---|
1 | 展示厅 | 100 | 1 | 2011-03-24 | |
2 | 大房间 | 最大的房间。 | 200 | 1 | 2010-06-03 |
3 | 开放空间 | 开发人员开放空间。 | 50 | 1 | 2011-03-15 |
4 | 大厅 | 入口。 | 20 | 1 | 2010-10-28 |
5 | 会议室 | 20 | 1 | 2010-05-12 | |
6 | 实际办公室 | 此办公室正在建设中。 | 5 | 0 | 2010-06-03 |
7 | 临时办公室 | 实际办公室正在建设期间使用的办公室。 | 5 | 1 | 2011-03-15 |
8 | 咖啡机 | 你可以暂停的房间。 | 5 | 1 | 2011-02-11 |
该语句以 CREATE TABLE 开头,表示我们要创建的是一个表。后面跟着表名(即 office
)。表名后面跟着圆括号,其中描述了表的所有列。列的描述以逗号分隔。每个描述包含列名(例如,id_office)、列类型(INTEGER、VARCHAR、CHAR、DATE 等)、可选的可空信息(表示列可以为空或 NOT NULL 表示列不能为空)以及可选的关键字 DEFAULT 后跟默认值或可选的关键字 PRIMARY KEY 表示该列为主键。如果未定义默认值,则 NULL 为默认值。如果定义了 NOT NULL,则该列不能将 NULL 作为默认值。
您可以看到,id_office
列已定义为主键,description
列可以为空,available
列的默认值为 1
。
表 ALTER 语句的完整语法如下所示
ALTER TABLE <table name>
{
ADD[ COLUMN] <column name> <column type>[ NOT NULL][ PRIMARY KEY| DEFAULT <value>]
|
ALTER[ COLUMN] <column name>[ SET DEFAULT <default option>| DROP DEFAULT]
|
DROP[ COLUMN] <column name>
|
ADD[ CONSTRAINT <constraint name>]
{
PRIMARY KEY (<column name>[, <column name>]*)
|
UNIQUE ([VALUE|<column name>[, <column name>]*])
|
FOREIGN KEY (<column name>[, <column name>]*) REFERENCES <table name> (<column name>[, <column name>]*)[ ON DELETE CASCADE][ ON UPDATE CASCADE]
|
CHECK (<predicate>[{ AND| OR} <predicate>]*)
}
|
DROP CONSTRAINT <constraint name>
};
ALTER 语句用于修改表。它可以用于包含记录的表。
此子句允许在表上添加约束,就像在表创建时可以做的那样。让我们在办公室的名称和描述上都添加唯一性约束
- 查询:
ALTER TABLE office ADD CONSTRAINT unique_name_and_description UNIQUE (name, description);
现在我们不能插入与已存在行的名称和描述相同的行,也不能更新与另一行的名称和描述相同的行。但是,我们可以仅插入名称相同或仅描述相同的行。
此子句允许通过其名称删除表上现有的约束。让我们删除前面在办公室的名称和描述上都添加的唯一性约束
- 查询:
ALTER TABLE office DROP CONSTRAINT unique_name_and_description;
现在我们再次可以插入与已存在行的名称和描述相同的行,并且可以更新与另一行的名称和描述相同的行。
让我们添加一个名为 has_video_projector
的新列,以指示我们是否可以投影幻灯片
- 语句之前的表:
id_office | name | description | place_number | available | next_inspection |
---|---|---|---|---|---|
1 | 展示厅 | 100 | 1 | 2011-03-24 | |
2 | 大房间 | 最大的房间。 | 200 | 1 | 2010-06-03 |
3 | 开放空间 | 开发人员开放空间。 | 50 | 1 | 2011-03-15 |
4 | 大厅 | 入口。 | 20 | 1 | 2010-10-28 |
5 | 会议室 | 20 | 1 | 2010-05-12 | |
6 | 实际办公室 | 此办公室正在建设中。 | 5 | 0 | 2010-06-03 |
7 | 临时办公室 | 实际办公室正在建设期间使用的办公室。 | 5 | 1 | 2011-03-15 |
8 | 咖啡机 | 你可以暂停的房间。 | 5 | 1 | 2011-02-11 |
- 查询:
ALTER TABLE office ADD has_video_projector SMALLINT DEFAULT 0;
- 语句后的表:
id_office | name | description | place_number | available | next_inspection | has_video_projector |
---|---|---|---|---|---|---|
1 | 展示厅 | 100 | 1 | 2011-03-24 | 0 | |
2 | 大房间 | 最大的房间。 | 200 | 1 | 2010-06-03 | 0 |
3 | 开放空间 | 开发人员开放空间。 | 50 | 1 | 2011-03-15 | 0 |
4 | 大厅 | 入口。 | 20 | 1 | 2010-10-28 | 0 |
5 | 会议室 | 20 | 1 | 2010-05-12 | 0 | |
6 | 实际办公室 | 此办公室正在建设中。 | 5 | 0 | 2010-06-03 | 0 |
7 | 临时办公室 | 实际办公室正在建设期间使用的办公室。 | 5 | 1 | 2011-03-15 | 0 |
8 | 咖啡机 | 你可以暂停的房间。 | 5 | 1 | 2011-02-11 | 0 |
has_video_projector
列已添加到末尾。该列已填充默认值。
现在让我们删除 next_inspection
列
- 语句之前的表:
id_office | name | description | place_number | available | next_inspection | has_video_projector |
---|---|---|---|---|---|---|
1 | 展示厅 | 100 | 1 | 2011-03-24 | 0 | |
2 | 大房间 | 最大的房间。 | 200 | 1 | 2010-06-03 | 0 |
3 | 开放空间 | 开发人员开放空间。 | 50 | 1 | 2011-03-15 | 0 |
4 | 大厅 | 入口。 | 20 | 1 | 2010-10-28 | 0 |
5 | 会议室 | 20 | 1 | 2010-05-12 | 0 | |
6 | 实际办公室 | 此办公室正在建设中。 | 5 | 0 | 2010-06-03 | 0 |
7 | 临时办公室 | 实际办公室正在建设期间使用的办公室。 | 5 | 1 | 2011-03-15 | 0 |
8 | 咖啡机 | 你可以暂停的房间。 | 5 | 1 | 2011-02-11 | 0 |
- 查询:
ALTER TABLE office DROP COLUMN next_inspection;
- 语句后的表:
id_office | name | description | place_number | available | has_video_projector | |
---|---|---|---|---|---|---|
1 | 展示厅 | 100 | 1 | 0 | ||
2 | 大房间 | 最大的房间。 | 200 | 1 | 0 | |
3 | 开放空间 | 开发人员开放空间。 | 50 | 1 | 0 | |
4 | 大厅 | 入口。 | 20 | 1 | 0 | |
5 | 会议室 | 20 | 1 | 0 | ||
6 | 实际办公室 | 此办公室正在建设中。 | 5 | 0 | 0 | |
7 | 临时办公室 | 实际办公室正在建设期间使用的办公室。 | 5 | 1 | 0 | |
8 | 咖啡机 | 你可以暂停的房间。 | 5 | 1 | 0 |
next_inspection
列已删除。如果要删除列,则需要删除应用于该列的任何约束(例如,如果仍然存在 unique_name_and_description 唯一性约束,则无法删除 name 或 description 列)。
DROP TABLE 语句用于完全删除表,包括其内容(数据)及其定义。
DROP TABLE <table name>;
阅读更多:DROP(维基百科)
TRUNCATE 快速删除表中的所有数据,而不更改表的结构,通常会绕过许多强制完整性和日志记录机制。
该语句在逻辑上(尽管在物理上并非如此)等效于没有 WHERE 子句的 DELETE 语句。因此,它不是数据定义语言 (DDL) 的一部分;它是数据操纵语言 (DML) 的一部分。我们在这里描述它,因为 DROP/DELETE/TRUNCATE 经常被混淆。
TRUNCATE TABLE <table_name>;