結構化查詢語言/資料定義語言
資料定義語言用於修改資料庫的模式。它永遠不會影響資料庫的使用者許可權。否則,它可能會擦除某些表中的記錄。它描述了三個語句: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>;