本文將介紹數(shù)據(jù)庫(kù)定義語(yǔ)言(DDL)用于創(chuàng)建數(shù)據(jù)庫(kù)和表格以及修改表格結(jié)果的指令。
當(dāng)你使用這些指令時(shí)一定要小心——它很容易刪去你的數(shù)據(jù)庫(kù)中的主要結(jié)構(gòu)令您丟失數(shù)據(jù)。所以,在您開始修改數(shù)據(jù)庫(kù)之前,您需要知道數(shù)據(jù)庫(kù)是什么。
數(shù)據(jù)庫(kù)之間的差異
本文中的樣品查詢系統(tǒng)遵循SQL92 ISO標(biāo)準(zhǔn)。并不是所有的數(shù)據(jù)庫(kù)都遵循該標(biāo)準(zhǔn),有些數(shù)據(jù)庫(kù)做了改進(jìn),這會(huì)產(chǎn)生不可預(yù)料的結(jié)果。
創(chuàng)建數(shù)據(jù)庫(kù)
為了創(chuàng)建表格,你首先需要需要?jiǎng)?chuàng)建一個(gè)可以容納表格的數(shù)據(jù)庫(kù)。SQL用于創(chuàng)建數(shù)據(jù)庫(kù)的基本語(yǔ)句是:
以下是引用片段:
CREATE DATABASE dbname;
你的數(shù)據(jù)庫(kù)用戶必須有建立數(shù)據(jù)庫(kù)的適當(dāng)權(quán)限。如果與你有關(guān)的用戶不能發(fā)出用于創(chuàng)建新數(shù)據(jù)庫(kù)的命令,要求數(shù)據(jù)庫(kù)管理員為你建立數(shù)據(jù)庫(kù),你也作為管理員登錄然后建立數(shù)據(jù)庫(kù)并設(shè)置權(quán)限。
舉個(gè)例子,用CREATE指令為一個(gè)應(yīng)用程序建立一個(gè)數(shù)據(jù)庫(kù)用于顯示一個(gè)目錄:
以下是引用片段:
CREATE DATABASE Catalog;
這給你一個(gè)用于在查詢時(shí)與其它表格區(qū)分的表格名字。下一步是創(chuàng)建用于輸入它的表格。
創(chuàng)建表格
如你所知,表格是有若干個(gè)欄目所組成。當(dāng)創(chuàng)建表格時(shí),你可以定義欄目并分配字段屬性。表格建立后,可以用ALTER表格指令來(lái)修改它,我們稍后將提到這一點(diǎn)。
你可以用下面這條指令來(lái)創(chuàng)建數(shù)據(jù)庫(kù),命令行的參數(shù)為表格名字、欄目名字,還有每一欄的數(shù)據(jù)類型。
以下是引用片段:
CREATE TABLE table_name
(column1 data_type, column2 data_type, column3 data_type);
不同的數(shù)據(jù)庫(kù)提供商的標(biāo)準(zhǔn)差別很大。你的幫助文檔中應(yīng)該有一段詳細(xì)說(shuō)明如何使用每一種數(shù)據(jù)、接受何種參數(shù)。
以下是引用片段:
Char
Char(8)
它包含了一個(gè)固定長(zhǎng)度的字符串,其值常常是字符串長(zhǎng)度。
Varchar
Varchar(128)
它包含了一個(gè)長(zhǎng)度不大于指定值的長(zhǎng)度可變的字符串。
Int
Int(32)
這是一個(gè)不大于指定值得整數(shù),也做Number或Integer。
Decimal
Decimal(12,2)
這是一個(gè)總位數(shù)和小數(shù)點(diǎn)后位數(shù)不大于指定值得小數(shù),
也被稱為Numeric或Number。
Binary
Binary
用于存儲(chǔ)二進(jìn)制對(duì)象,在數(shù)據(jù)庫(kù)中它一般不可分解和顯示,
也稱為Raw或Blob。
Boolean
Boolean
用來(lái)只是真或假,也成為Bit或Byte。
通用數(shù)據(jù)類型
在本例中,我們建立了一個(gè)存放庫(kù)存商品信息的表格。所用到的欄目和數(shù)據(jù)類型如表B所示:
以下是引用片段:
欄目名稱:
prod_id
prod_color
prod_descr
prod_size
數(shù)據(jù)類型:
Int(16)
Varchar(20)
Varchar(255)
Decimal(8,2)
在本例中,我使用了三種基本數(shù)據(jù)類型;然而,在實(shí)際使用時(shí),根據(jù)數(shù)據(jù)庫(kù)支持的內(nèi)容,我可能還用用上tinyint、文本和mediumtext數(shù)據(jù)類型。
發(fā)出如下指令來(lái)建立表格:
以下是引用片段:
CREATE TABLE Products
(prod_id INT(16), prod_color VARCHAR(20),
prod_descr VARCHAR(255), prod_size DECIMAL(8,2));
如果這些指令順利完成,你就可以在表格中正常地插入信息。
除了數(shù)據(jù)類型,你還可以在創(chuàng)建表格時(shí)定義自動(dòng)增量字段(auto-incremented field)、關(guān)鍵字、索引和特殊數(shù)值限制。在表格定義時(shí),這些參數(shù)與數(shù)據(jù)類型一同傳遞。如果在創(chuàng)建表格Product時(shí)定義具有特殊數(shù)值限制的自動(dòng)增量prod_id,命令如下:
以下是引用片段:
CREATE TABLE Products
(prod_id INT(16)AUTO_INCREMENT,
prod_color VARCHAR(20), prod_descr VARCHAR(255),
prod_size DECIMAL(8,2), UNIQUE (`prod_id`));
如果把prod_id做為索引字段定義,可以用CREATE INDEX:
以下是引用片段:
CREATE INDEX ProdIndex ON Product (prod_id);
這里有必要重申:數(shù)據(jù)庫(kù)提供商在關(guān)鍵字的處理上有所不同。所以,具體情況請(qǐng)參考你的數(shù)據(jù)庫(kù)提供商的文檔。
修改表格
當(dāng)你開始對(duì)表格進(jìn)行操作時(shí),你也許覺(jué)得有必要修改表格的結(jié)構(gòu)、字段類型等等。在前面,我強(qiáng)烈建議你避免在生產(chǎn)環(huán)境(production environment)這么做。因?yàn)橛行┎僮?,如添加、刪除和修改字段可能會(huì)刪除或破壞相關(guān)字段中的數(shù)據(jù)。
好,現(xiàn)在讓我們看看如何修改表格。首先,在表格Product中加入一欄。你可以指定該欄插入的相對(duì)其它欄的位置,也可以讓它插到表格末端(默認(rèn)):
以下是引用片段:
ALTER TABLE Product ADD prod_name VARCHAR(20) AFTER prod_id
用類似的語(yǔ)句刪除一個(gè)欄目:
以下是引用片段:
ALTER TABLE Product DROP prod_size;
最后,更改一個(gè)欄目的數(shù)據(jù)類型:
以下是引用片段:
ALTER TABLE Product CHANGE prod_color prod_color_id INT(20);
現(xiàn)在,你的表格如表C所示:
以下是引用片段:
欄目名稱:
prod_id
prod_name
prod_color_id
prod_descr
數(shù)據(jù)類型:
Int(16)
Varchar(20)
Int(20)
Varchar(255))
注意,有些數(shù)據(jù)庫(kù)不支持關(guān)鍵字DROP。另外,如果你改變現(xiàn)有的某一欄的數(shù)據(jù)類型,大多數(shù)數(shù)據(jù)庫(kù)會(huì)試圖轉(zhuǎn)化該欄目現(xiàn)有數(shù)據(jù)的數(shù)據(jù)類型。然而,如果是轉(zhuǎn)為一個(gè)不支持的數(shù)據(jù)類型,數(shù)據(jù)就有可能丟失。舉例來(lái)說(shuō),如果把一個(gè)類型為Varchar的包含人名字的字段改為Int類型,轉(zhuǎn)換的結(jié)果可能是整型的默認(rèn)值。
刪除表格和數(shù)據(jù)庫(kù)
在刪除表格和數(shù)據(jù)庫(kù)之前,你需要確保丟失這些數(shù)據(jù)不會(huì)造成惡果。如果你刪除數(shù)據(jù)庫(kù),庫(kù)中的所有表格和內(nèi)容都會(huì)被清除。如果你刪除一個(gè)表格,表格中的所有內(nèi)容都會(huì)丟失,但是庫(kù)中的其它表格沒(méi)有影響。
在刪除表格或整個(gè)欄目之前,你必須清楚數(shù)據(jù)庫(kù)的結(jié)構(gòu)。如果你進(jìn)入一個(gè)已經(jīng)存在的數(shù)據(jù)庫(kù)并錯(cuò)誤刪除了某個(gè)元素,可能會(huì)影響到促發(fā)條件(?trigger)、存儲(chǔ)過(guò)程和視圖。有些數(shù)據(jù)庫(kù)支持用關(guān)鍵字RESTRICT和CASCADE去預(yù)防由于刪除表格帶來(lái)的損失。RESTRICT一般按默認(rèn)設(shè)置,預(yù)防丟失表格,而CASCADE用于刪除與該表格有關(guān)的實(shí)體。
現(xiàn)在上面建立的表格Product是可以被刪除的,我們開始刪除它:
以下是引用片段:
DROP TABLE Product;
現(xiàn)在刪除數(shù)據(jù)庫(kù):
以下是引用片段:
DROP DATABASE Catalog;
大多數(shù)數(shù)據(jù)庫(kù)軟件提供商支持DROP DATABASE命令,盡管它是在SQL99標(biāo)準(zhǔn)中被定義而不是SQL92。
部分?jǐn)?shù)據(jù)庫(kù)提供了FLUSH命令,該命令可以讓你刪除表格中的內(nèi)容但又可以保持表格的結(jié)果,:
以下是引用片段:
FLUSH TABLE Product;
如你所見,刪除數(shù)據(jù)庫(kù)中的主要結(jié)構(gòu)并丟失所存的所有數(shù)據(jù)的容易程度令人難以想象,所以,一定要小心使用這些命令,而當(dāng)你不清楚數(shù)據(jù)庫(kù)中的內(nèi)容時(shí),就不要使用這些命令。
當(dāng)你使用這些指令時(shí)一定要小心——它很容易刪去你的數(shù)據(jù)庫(kù)中的主要結(jié)構(gòu)令您丟失數(shù)據(jù)。所以,在您開始修改數(shù)據(jù)庫(kù)之前,您需要知道數(shù)據(jù)庫(kù)是什么。
數(shù)據(jù)庫(kù)之間的差異
本文中的樣品查詢系統(tǒng)遵循SQL92 ISO標(biāo)準(zhǔn)。并不是所有的數(shù)據(jù)庫(kù)都遵循該標(biāo)準(zhǔn),有些數(shù)據(jù)庫(kù)做了改進(jìn),這會(huì)產(chǎn)生不可預(yù)料的結(jié)果。
創(chuàng)建數(shù)據(jù)庫(kù)
為了創(chuàng)建表格,你首先需要需要?jiǎng)?chuàng)建一個(gè)可以容納表格的數(shù)據(jù)庫(kù)。SQL用于創(chuàng)建數(shù)據(jù)庫(kù)的基本語(yǔ)句是:
以下是引用片段:
CREATE DATABASE dbname;
你的數(shù)據(jù)庫(kù)用戶必須有建立數(shù)據(jù)庫(kù)的適當(dāng)權(quán)限。如果與你有關(guān)的用戶不能發(fā)出用于創(chuàng)建新數(shù)據(jù)庫(kù)的命令,要求數(shù)據(jù)庫(kù)管理員為你建立數(shù)據(jù)庫(kù),你也作為管理員登錄然后建立數(shù)據(jù)庫(kù)并設(shè)置權(quán)限。
舉個(gè)例子,用CREATE指令為一個(gè)應(yīng)用程序建立一個(gè)數(shù)據(jù)庫(kù)用于顯示一個(gè)目錄:
以下是引用片段:
CREATE DATABASE Catalog;
這給你一個(gè)用于在查詢時(shí)與其它表格區(qū)分的表格名字。下一步是創(chuàng)建用于輸入它的表格。
創(chuàng)建表格
如你所知,表格是有若干個(gè)欄目所組成。當(dāng)創(chuàng)建表格時(shí),你可以定義欄目并分配字段屬性。表格建立后,可以用ALTER表格指令來(lái)修改它,我們稍后將提到這一點(diǎn)。
你可以用下面這條指令來(lái)創(chuàng)建數(shù)據(jù)庫(kù),命令行的參數(shù)為表格名字、欄目名字,還有每一欄的數(shù)據(jù)類型。
以下是引用片段:
CREATE TABLE table_name
(column1 data_type, column2 data_type, column3 data_type);
不同的數(shù)據(jù)庫(kù)提供商的標(biāo)準(zhǔn)差別很大。你的幫助文檔中應(yīng)該有一段詳細(xì)說(shuō)明如何使用每一種數(shù)據(jù)、接受何種參數(shù)。
以下是引用片段:
Char
Char(8)
它包含了一個(gè)固定長(zhǎng)度的字符串,其值常常是字符串長(zhǎng)度。
Varchar
Varchar(128)
它包含了一個(gè)長(zhǎng)度不大于指定值的長(zhǎng)度可變的字符串。
Int
Int(32)
這是一個(gè)不大于指定值得整數(shù),也做Number或Integer。
Decimal
Decimal(12,2)
這是一個(gè)總位數(shù)和小數(shù)點(diǎn)后位數(shù)不大于指定值得小數(shù),
也被稱為Numeric或Number。
Binary
Binary
用于存儲(chǔ)二進(jìn)制對(duì)象,在數(shù)據(jù)庫(kù)中它一般不可分解和顯示,
也稱為Raw或Blob。
Boolean
Boolean
用來(lái)只是真或假,也成為Bit或Byte。
通用數(shù)據(jù)類型
在本例中,我們建立了一個(gè)存放庫(kù)存商品信息的表格。所用到的欄目和數(shù)據(jù)類型如表B所示:
以下是引用片段:
欄目名稱:
prod_id
prod_color
prod_descr
prod_size
數(shù)據(jù)類型:
Int(16)
Varchar(20)
Varchar(255)
Decimal(8,2)
在本例中,我使用了三種基本數(shù)據(jù)類型;然而,在實(shí)際使用時(shí),根據(jù)數(shù)據(jù)庫(kù)支持的內(nèi)容,我可能還用用上tinyint、文本和mediumtext數(shù)據(jù)類型。
發(fā)出如下指令來(lái)建立表格:
以下是引用片段:
CREATE TABLE Products
(prod_id INT(16), prod_color VARCHAR(20),
prod_descr VARCHAR(255), prod_size DECIMAL(8,2));
如果這些指令順利完成,你就可以在表格中正常地插入信息。
除了數(shù)據(jù)類型,你還可以在創(chuàng)建表格時(shí)定義自動(dòng)增量字段(auto-incremented field)、關(guān)鍵字、索引和特殊數(shù)值限制。在表格定義時(shí),這些參數(shù)與數(shù)據(jù)類型一同傳遞。如果在創(chuàng)建表格Product時(shí)定義具有特殊數(shù)值限制的自動(dòng)增量prod_id,命令如下:
以下是引用片段:
CREATE TABLE Products
(prod_id INT(16)AUTO_INCREMENT,
prod_color VARCHAR(20), prod_descr VARCHAR(255),
prod_size DECIMAL(8,2), UNIQUE (`prod_id`));
如果把prod_id做為索引字段定義,可以用CREATE INDEX:
以下是引用片段:
CREATE INDEX ProdIndex ON Product (prod_id);
這里有必要重申:數(shù)據(jù)庫(kù)提供商在關(guān)鍵字的處理上有所不同。所以,具體情況請(qǐng)參考你的數(shù)據(jù)庫(kù)提供商的文檔。
修改表格
當(dāng)你開始對(duì)表格進(jìn)行操作時(shí),你也許覺(jué)得有必要修改表格的結(jié)構(gòu)、字段類型等等。在前面,我強(qiáng)烈建議你避免在生產(chǎn)環(huán)境(production environment)這么做。因?yàn)橛行┎僮?,如添加、刪除和修改字段可能會(huì)刪除或破壞相關(guān)字段中的數(shù)據(jù)。
好,現(xiàn)在讓我們看看如何修改表格。首先,在表格Product中加入一欄。你可以指定該欄插入的相對(duì)其它欄的位置,也可以讓它插到表格末端(默認(rèn)):
以下是引用片段:
ALTER TABLE Product ADD prod_name VARCHAR(20) AFTER prod_id
用類似的語(yǔ)句刪除一個(gè)欄目:
以下是引用片段:
ALTER TABLE Product DROP prod_size;
最后,更改一個(gè)欄目的數(shù)據(jù)類型:
以下是引用片段:
ALTER TABLE Product CHANGE prod_color prod_color_id INT(20);
現(xiàn)在,你的表格如表C所示:
以下是引用片段:
欄目名稱:
prod_id
prod_name
prod_color_id
prod_descr
數(shù)據(jù)類型:
Int(16)
Varchar(20)
Int(20)
Varchar(255))
注意,有些數(shù)據(jù)庫(kù)不支持關(guān)鍵字DROP。另外,如果你改變現(xiàn)有的某一欄的數(shù)據(jù)類型,大多數(shù)數(shù)據(jù)庫(kù)會(huì)試圖轉(zhuǎn)化該欄目現(xiàn)有數(shù)據(jù)的數(shù)據(jù)類型。然而,如果是轉(zhuǎn)為一個(gè)不支持的數(shù)據(jù)類型,數(shù)據(jù)就有可能丟失。舉例來(lái)說(shuō),如果把一個(gè)類型為Varchar的包含人名字的字段改為Int類型,轉(zhuǎn)換的結(jié)果可能是整型的默認(rèn)值。
刪除表格和數(shù)據(jù)庫(kù)
在刪除表格和數(shù)據(jù)庫(kù)之前,你需要確保丟失這些數(shù)據(jù)不會(huì)造成惡果。如果你刪除數(shù)據(jù)庫(kù),庫(kù)中的所有表格和內(nèi)容都會(huì)被清除。如果你刪除一個(gè)表格,表格中的所有內(nèi)容都會(huì)丟失,但是庫(kù)中的其它表格沒(méi)有影響。
在刪除表格或整個(gè)欄目之前,你必須清楚數(shù)據(jù)庫(kù)的結(jié)構(gòu)。如果你進(jìn)入一個(gè)已經(jīng)存在的數(shù)據(jù)庫(kù)并錯(cuò)誤刪除了某個(gè)元素,可能會(huì)影響到促發(fā)條件(?trigger)、存儲(chǔ)過(guò)程和視圖。有些數(shù)據(jù)庫(kù)支持用關(guān)鍵字RESTRICT和CASCADE去預(yù)防由于刪除表格帶來(lái)的損失。RESTRICT一般按默認(rèn)設(shè)置,預(yù)防丟失表格,而CASCADE用于刪除與該表格有關(guān)的實(shí)體。
現(xiàn)在上面建立的表格Product是可以被刪除的,我們開始刪除它:
以下是引用片段:
DROP TABLE Product;
現(xiàn)在刪除數(shù)據(jù)庫(kù):
以下是引用片段:
DROP DATABASE Catalog;
大多數(shù)數(shù)據(jù)庫(kù)軟件提供商支持DROP DATABASE命令,盡管它是在SQL99標(biāo)準(zhǔn)中被定義而不是SQL92。
部分?jǐn)?shù)據(jù)庫(kù)提供了FLUSH命令,該命令可以讓你刪除表格中的內(nèi)容但又可以保持表格的結(jié)果,:
以下是引用片段:
FLUSH TABLE Product;
如你所見,刪除數(shù)據(jù)庫(kù)中的主要結(jié)構(gòu)并丟失所存的所有數(shù)據(jù)的容易程度令人難以想象,所以,一定要小心使用這些命令,而當(dāng)你不清楚數(shù)據(jù)庫(kù)中的內(nèi)容時(shí),就不要使用這些命令。