跳转到内容

结构化查询语言/数据定义语言

100% developed
来自 Wikibooks,开放世界中的开放书籍

← 数据操纵语言 | 数据控制语言 → 数据定义语言用于修改数据库的模式。它永远不会影响数据库的用户权限。否则,它可能会擦除某些表中的记录。它描述了三个语句:CREATE、ALTER 和 DROP。

CREATE 语句

[编辑 | 编辑源代码]

表 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
);
  • 语句后的表:
office
id_office INTEGER
name VARCHAR(20)
description VARCHAR(255)
place_number INTEGER
available SMALLINT
next_inspection DATE

现在可以像使用 reunionemployeeprojectmembers 表一样使用和填充 office 表了

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 语句的完整语法如下所示

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 语句用于修改表。它可以用于包含记录的表。

ADD CONSTRAINT 子句

[编辑 | 编辑源代码]

此子句允许在表上添加约束,就像在表创建时可以做的那样。让我们在办公室的名称和描述上都添加唯一性约束

  • 查询:
ALTER TABLE office ADD CONSTRAINT unique_name_and_description UNIQUE (name, description);

现在我们不能插入与已存在行的名称和描述相同的行,也不能更新与另一行的名称和描述相同的行。但是,我们可以仅插入名称相同或仅描述相同的行。

DROP CONSTRAINT 子句

[编辑 | 编辑源代码]

此子句允许通过其名称删除表上现有的约束。让我们删除前面在办公室的名称和描述上都添加的唯一性约束

  • 查询:
ALTER TABLE office DROP CONSTRAINT unique_name_and_description;

现在我们再次可以插入与已存在行的名称和描述相同的行,并且可以更新与另一行的名称和描述相同的行。

ADD COLUMN 子句

[编辑 | 编辑源代码]

让我们添加一个名为 has_video_projector 的新列,以指示我们是否可以投影幻灯片

  • 语句之前的表:
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
  • 查询:
ALTER TABLE office ADD has_video_projector SMALLINT DEFAULT 0;
  • 语句后的表:
office
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 列已添加到末尾。该列已填充默认值。

DROP COLUMN 子句

[编辑 | 编辑源代码]

现在让我们删除 next_inspection

  • 语句之前的表:
office
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;
  • 语句后的表:
office
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 语句用于完全删除表,包括其内容(数据)及其定义。

DROP TABLE <table name>;

阅读更多:DROP(维基百科)

TRUNCATE 语句

[编辑 | 编辑源代码]

TRUNCATE 快速删除表中的所有数据,而不更改表的结构,通常会绕过许多强制完整性和日志记录机制。

该语句在逻辑上(尽管在物理上并非如此)等效于没有 WHERE 子句的 DELETE 语句。因此,它不是数据定义语言 (DDL) 的一部分;它是数据操纵语言 (DML) 的一部分。我们在这里描述它,因为 DROP/DELETE/TRUNCATE 经常被混淆。

TRUNCATE TABLE <table_name>;


华夏公益教科书