跳轉到內容

結構化查詢語言/資料定義語言

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>;


華夏公益教科書