(五)創建和修改表格
再次歡迎您來到SQL(結構化查詢語言)基礎系列教程。本文將介紹數據庫定義語言(DDL)用於創建數據庫和表格以及修改表格結果的指令。
當你使用這些指令時一定要小心——它很容易刪去你的數據庫中的主要結構令您丟失數據。所以,在您開始修改數據庫之前,您需要知道數據庫是什麼。
數據庫之間的差異
本文中的樣品查詢系統遵循SQL92 ISO標准。並不是所有的數據庫都遵循該標准,有些數據庫做了改進,這會產生不可預料的結果。如果你不能確定你的數據庫是否支持該標准,請參考相應的文檔。
創建數據庫
為了創建表格,你首先需要需要創建一個可以容納表格的數據庫。SQL用於創建數據庫的基本語句是:
CREATE DATABASE dbname;
你的數據庫用戶必須有建立數據庫的適當權限。如果與你有關的用戶不能發出用於創建新數據庫的命令,要求數據庫管理員為你建立數據庫,你也作為管理員登錄然後建立數據庫並設置權限。
舉個例子,用CREATE指令為一個應用程序建立一個數據庫用於顯示一個目錄:
CREATE DATABASE Catalog;
這給你一個用於在查詢時與其它表格區分的表格名字。下一步是創建用於輸入它的表格。
創建表格
如你所知,表格是有若干個欄目所組成。當創建表格時,你可以定義欄目並分配字段屬性。表格建立後,可以用ALTER表格指令來修改它,我們稍後將提到這一點。
你可以用下面這條指令來創建數據庫,命令行的參數為表格名字、欄目名字,還有每一欄的數據類型。
CREATE TABLE table_name
(column1 data_type, column2 data_type, column3 data_type);
不同的數據庫提供商的標准差別很大。你的幫助文檔中應該有一段詳細說明如何使用每一種數據、接受何種參數。為了通用,我在表A中列出了一些常用的數據類型。
數據類型、用法、詳細說明
Char
Char(8)
它包含了一個固定長度的字符串,其值常常是字符串長度。
Varchar
Varchar(128)
它包含了一個長度不大於指定值的長度可變的字符串。
Int
Int(32)
這是一個不大於指定值得整數,也做Number或Integer。
Decimal
Decimal(12,2)
這是一個總位數和小數點後位數不大於指定值得小數,也被稱為Numeric或Number。
Binary
Binary
用於存儲二進制對象,在數據庫中它一般不可分解和顯示,也稱為Raw或Blob。
Boolean
Boolean
用來只是真或假,也成為Bit或Byte。
通用數據類型
在本例中,我們建立了一個存放庫存商品信息的表格。所用到的欄目和數據類型如表B所示:
欄目名稱:
prod_id
prod_color
prod_descr
prod_size
數據類型:
Int(16)
Varchar(20)
Varchar(255)
Decimal(8,2)
在本例中,我使用了三種基本數據類型;然而,在實際使用時,根據數據庫支持的內容,我可能還用用上tinyint、文本和mediumtext數據類型。
發出如下指令來建立表格:
CREATE TABLE Products
(prod_id INT(16), prod_color VARCHAR(20), prod_descr VARCHAR(255), prod_size DECIMAL(8,2));
如果這些指令順利完成,你就可以在表格中正常地插入信息。你可以參到文章SQL基礎一:數據查詢"得到詳細說明。
除了數據類型,你還可以在創建表格時定義自動增量字段(auto-incremented fIEld)、關鍵字、索引和特殊數值限制。在表格定義時,這些參數與數據類型一同傳遞。如果在創建表格Product時定義具有特殊數值限制的自動增量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);
這裡有必要重申:數據庫提供商在關鍵字的處理上有所不同。所以,具體情況請參考你的數據庫提供商的文檔。
關於索引的更多內容:
索引是一個比較深的課題。除了介紹有關關鍵字和索引的理論,Builder.com的供稿人Eric Roland寫了幾篇很好的文章,你可以通過它們來學到更多的相關知識。
修改表格
當你開始對表格進行操作時,你也許覺得有必要修改表格的結構、字段類型等等。在前面,我強烈建議你避免在生產環境(production environment)這麼做。因為有些操作,如添加、刪除和修改字段可能會刪除或破壞相關字段中的數據。
好,現在讓我們看看如何修改表格。首先,在表格Product中加入一欄。你可以指定該欄插入的相對其它欄的位置,也可以讓它插到表格末端(默認):
ALTER TABLE Product ADD prod_name VARCHAR(20) AFTER prod_id;
用類似的語句刪除一個欄目:
ALTER TABLE Product DROP prod_size;
最後,更改一個欄目的數據類型:
ALTER TABLE Product CHANGE prod_color prod_color_id INT(20);
現在,你的表格如表C所示:
欄目名稱:
prod_id
prod_name
prod_color_id
prod_descr
數據類型:
Int(16)
Varchar(20)
Int(20)
Varchar(255))
注意,有些數據庫不支持關鍵字DROP。另外,如果你改變現有的某一欄的數據類型,大多數數據庫會試圖轉化該欄目現有數據的數據類型。然而,如果是轉為一個不支持的數據類型,數據就有可能丟失。舉例來說,如果把一個類型為Varchar的包含人名字的字段改為Int類型,轉換的結果可能是整型的默認值。
刪除表格和數據庫
在刪除表格和數據庫之前,你需要確保丟失這些數據不會造成惡果。如果你刪除數據庫,庫中的所有表格和內容都會被清除。如果你刪除一個表格,表格中的所有內容都會丟失,但是庫中的其它表格沒有影響。
在刪除表格或整個欄目之前,你必須清楚數據庫的結構。如果你進入一個已經存在的數據庫並錯誤刪除了某個元素,可能會影響到促發條件(?trigger)、存儲過程和視圖。有些數據庫支持用關鍵字RESTRICT和CASCADE去預防由於刪除表格帶來的損失。RESTRICT一般按默認設置,預防丟失表格,而CASCADE用於刪除與該表格有關的實體。
現在上面建立的表格Product是可以被刪除的,我們開始刪除它:
DROP TABLE Product;
現在刪除數據庫:
DROP DATABASE Catalog;
大多數數據庫軟件提供商支持DROP DATABASE命令,盡管它是在SQL99標准中被定義而不是SQL92。
部分數據庫提供了FLUSH命令,該命令可以讓你刪除表格中的內容但又可以保持表格的結果,:
FLUSH TABLE Product;
如你所見,刪除數據庫中的主要結構並丟失所存的所有數據的容易程度令人難以想象,所以,一定要小心使用這些命令,而當你不清楚數據庫中的內容時,就不要使用這些命令。
數據庫管理
在前一篇文章中,你學會了如何在一個或多個表格中查找數據。現在,你學會了如何把你操作數據庫結構。你學會了創建、修改並銷毀表格和數據。這些都是設計數據庫驅動的應用程序的必須用的操作。