在本教程中,您將學(xué)習(xí)如何使用SQL在數(shù)據(jù)庫(kù)內(nèi)部創(chuàng)建表。
在上一章中,我們學(xué)習(xí)了如何在數(shù)據(jù)庫(kù)服務(wù)器上創(chuàng)建數(shù)據(jù)庫(kù)。現(xiàn)在是時(shí)候在數(shù)據(jù)庫(kù)中創(chuàng)建一些表,這些表實(shí)際上將保存數(shù)據(jù)。數(shù)據(jù)庫(kù)表只是將信息組織成行和列。
SQL CREATE TABLE語(yǔ)句用于創(chuàng)建表。
創(chuàng)建表的基本語(yǔ)法可以通過(guò)以下方式給出:
CREATE TABLE table_name (column1_name data_type constraints,column2_name data_type constraints,.... );
為了輕松理解此語(yǔ)法,讓我們?cè)?em>演示數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)表。在MySQL命令行工具上鍵入以下語(yǔ)句,然后按Enter:
-- MySQL數(shù)據(jù)庫(kù)的語(yǔ)法 CREATE TABLE persons ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, birth_date DATE, phone VARCHAR(15) NOT NULL UNIQUE ); -- SQL Server數(shù)據(jù)庫(kù)的語(yǔ)法 CREATE TABLE persons ( id INT NOT NULL PRIMARY KEY IDENTITY(1,1), name VARCHAR(50) NOT NULL, birth_date DATE, phone VARCHAR(15) NOT NULL UNIQUE );
上面的語(yǔ)句創(chuàng)建一個(gè)名為person的表,該表具有id,name,birth_date和phone四列。注意,每個(gè)列名后都有一個(gè)數(shù)據(jù)類型聲明;此聲明指定列將存儲(chǔ)什么類型的數(shù)據(jù),整數(shù),字符串,日期等。
某些數(shù)據(jù)類型可以使用length參數(shù)聲明,該參數(shù)指示可以在列中存儲(chǔ)多少個(gè)字符。例如,VARCHAR(50)最多可容納50個(gè)字符。
注意:列的數(shù)據(jù)類型可能會(huì)因數(shù)據(jù)庫(kù)系統(tǒng)而異。例如,MySQL和SQL Server支持INT整數(shù)值的數(shù)據(jù)類型,而Oracle數(shù)據(jù)庫(kù)支持NUMBER數(shù)據(jù)類型。
下表總結(jié)了MySQL支持的最常用的數(shù)據(jù)類型。
數(shù)據(jù)類型 | 描述 |
---|---|
INT | 存儲(chǔ)介于-2147483648至2147483647之間的數(shù)值 |
DECIMAL | 以精確的精度存儲(chǔ)十進(jìn)制值。 |
CHAR | 存儲(chǔ)最大長(zhǎng)度為255個(gè)字符的定長(zhǎng)字符串。 |
VARCHAR | 存儲(chǔ)可變長(zhǎng)度的字符串,最大長(zhǎng)度為65,535個(gè)字符。 |
TEXT | 存儲(chǔ)最大大小為65,535個(gè)字符的字符串。 |
DATE | 以YYYY-MM-DD格式存儲(chǔ)日期值。 |
DATETIME | 以YYYY-MM-DD HH:MM:SS格式存儲(chǔ)組合的日期/時(shí)間值。 |
TIMESTAMP | 存儲(chǔ)時(shí)間戳值。TIMESTAMP值存儲(chǔ)為自Unix紀(jì)元('1970-01-01 00:00:01'UTC)以來(lái)的秒數(shù)。 |
請(qǐng)查看參考部分SQL DB數(shù)據(jù)類型,以獲取有關(guān)流行的RDBMS(如MySQL,SQL Server等)中可用的所有數(shù)據(jù)類型的詳細(xì)信息。
在前面的語(yǔ)句中為表列設(shè)置了一些其他約束(也稱為修飾符)。約束定義關(guān)于列中允許的值的規(guī)則。
NOT NULL約束確保該字段不能接受一個(gè)NULL值。
PRIMARY KEY約束標(biāo)記對(duì)應(yīng)的字段作為表的主鍵。
AUTO_INCREMENT屬性是標(biāo)準(zhǔn)SQL的MySQL擴(kuò)展,它告訴MySQL如果未指定該值,則通過(guò)將前一個(gè)值增加1來(lái)自動(dòng)為該字段分配一個(gè)值。僅適用于數(shù)字字段。
UNIQUE約束確保一列的每一行必須具有唯一值。
在下一章中,我們將學(xué)習(xí)有關(guān)SQL約束的更多信息。
注意: Microsoft SQL Server使用該IDENTITY屬性來(lái)執(zhí)行自動(dòng)增量功能。默認(rèn)值為IDENTITY(1,1),即種子或起始值為1,增量值為1。
提示:您可以執(zhí)行命令以查看MySQL和Oracle數(shù)據(jù)庫(kù)中任何表的列信息或任何表的結(jié)構(gòu),而在SQL Server中(將table_name替換為實(shí)際的表名)。DESC table_name;EXEC sp_columns table_name;
如果您嘗試創(chuàng)建數(shù)據(jù)庫(kù)中已經(jīng)存在的表,則會(huì)收到錯(cuò)誤消息。為了避免這種情況,可以在MySQL中使用可選子句IF NOT EXISTS,如下所示:
CREATE TABLE IF NOT EXISTS persons ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, birth_date DATE, phone VARCHAR(15) NOT NULL UNIQUE );
提示:如果要查看當(dāng)前選定數(shù)據(jù)庫(kù)內(nèi)的表的列表,可以SHOW TABLES;在MySQL命令行上執(zhí)行語(yǔ)句。