CREATE 語句
CREATE語句的開頭都是一樣的,然后是特定的細節。
CREATE <object type> <object name>
一、CREATE DATABASE
CREATE DATABASE命令用於創建一個數據庫,創建一個數據庫的最基本語法如下所示:
CREATE DATABASE <database name>
CREATE DATABASE的完整語法
CREATE DATABASE <NewDataBase> [ON [PRIMARY] ([NAME = <'logical file name'>,] FILENAME = <'file name'> [, SIZE = <size in kilobytes,megabytes,gigabytes,or terabytes>] [, MAXSIZE = <size in kilobytes,megabytes,gigabytes,or terabytes>] [, FILEGROWTH = <kilobytes,megabytes,gigabytes,or terabytes|percentage>])] [LOG ON ([NAME = <'logical file name'>,] FILENAME = <'file name'> [, SIZE = <size in kilobytes,megabytes,gigabytes,or terabytes>] [, MAXSIZE = <size in kilobytes,megabytes,gigabytes,or terabytes>] [, FILEGROWTH = <kilobytes,megabytes,gigabytes,or terabytes|percentage>])] [COLLATE <collation name>] [FOR ATTAH [WITH <service broker>]| FOR ATTACH_REBUILD_LOG| WITH DB_CHAINING ON| OFF | TRUSTWORTHY ON|OFF] [AS SNAPSHOT OF <source database name>] [;]
下面來說明一下:
1、ON
ON用於兩個地方:一是定義存儲數據的文件位置,二是定義存儲日志的文件位置。PRIMARY意味着隨后是無上上存儲數據的主文件組。也可以將數據存儲在所謂的附屬文件組里。
SQL Server允許將數據庫存儲在多個文件中,而且允許將這些文件放在一個邏輯組里面,稱為文件組
2、NAME
這個選項用於指定定義的文件的名稱,但只是一個邏輯名稱-SQL Server在內部使用該名稱引用該文件。當需要修改(擴充或縮小)數據庫和/或文件的大小事,需要使用這個名稱。
3、FILENAME
這個選項,顧名思義-實際操作系統文件在磁盤上的物理名稱,在該文件中將存儲數據或日志(取決於定義哪個部分)。默認情況下,文件位於
\Program Files\Microsoft SQLServer10.MSSQLSERVER\MSSQL(或者SQL Server安裝主目錄)的\Data子目錄下。如果是處理物理數據庫文件,那么名稱將和數據庫名稱一樣,但是帶有.mdf擴展名。如果處理日志文件,那么名稱和數據庫文件的名稱一樣,但是有后綴_Log以及擴展名.ldf。建議使用默認擴展名.mdf(數據庫)和.ldf(日志文件)。附屬文件的擴展名是.ndf。
4、SIZE
數據庫的大小。默認情況下大小的單位是M(兆字節),但是可以通過在數字后面使用KB而不是MB來指定kilobyte(千字節),或者更大的單位GB或者甚至TB。這個值至少與模型數據庫一樣大,而且必須是整數(不能帶小數),否則出錯。如果沒有為SIZE提供一個值,那么數據庫的初始大小值與模型數據庫一樣。
5、MAXSIZE
SQL Server有一個機制允許數據庫在必要的時候自動分配附加的磁盤空間(增加大小)。MAXSIZE是數據庫可以增加的最大大小。默認情況下,單位是M,但是同SIZE一樣,可以使用KB、GB、TB來指定不同的單位。稍微不同的是,這個選項沒有固定的默認值。如果沒有提供這個值,那么認為沒有最大值-實際的大小可以達到磁盤空間用完為止。
如果數據庫的大小達到了MAXSIZE參數指定的值,那么將開始出錯,插入數據將不能執行。如果日志達到最大值,那么在數據庫中將無法執行任何日志活動。
6、FILEGROWTH
FILEGROWTH主要用於確定數據庫達到這個最大值的速度。提供一個值來說明文件每次增加多少字節(以KB、MB、GB、TB為單位)。或者,也可以按照指定數據庫文件的每次增長百分比。如果選擇百分比,那么數據庫大小將按照當前數據文件的大小以指定的百分比增長。因此,如果指定一個初始大小為1GB的數據庫文件以20%的速度增長,那么第一次擴展后為1.2GB,第二次擴展后為1.44GB。
7、LOG ON
LOG ON選項允許指定哪些文件需要日志,以及這些文件位於什么位置。如果沒有指定該選項,那么SQL Server將在一個單獨文件中創建日志,日志文件默認的大小是數據庫文件的25%。在大多數其他方面,日志文件與主數據庫文件具有同樣的文件規范參數。
提示:
日志文件最好存儲在與主數據文件不同的磁盤分區上。這樣除了提供針對某個磁盤驅動器失效的額外安全措施外,還可以避免主數據文件與日志文件競爭磁盤文件的輸入輸出口。
8、COLLATE
該選項處理排序、字母大小寫以及是否重音敏感問題。在安裝SQL Server時,提供了默認的排序規則,但是可以在數據庫層重寫該默認值。
9、FOR ATTACH
可以使用該選項將已存在的一些數據庫文件附加到當前的服務器上。這里的文件必須是數據庫的一部分,並且在某個時候已經使用sp_detach_db恰當地與數據庫分離了。這樣貶低了sp_detach_db的功能,但是帶有FOR ATTACH的CREATE DATABASE命令具有可以訪問32000多個文件的優點,而sp_attach_db只限於16個文件。
如果使用FOR ATTACH,那么必須完成文件位置信息中的ON PRIMARY部分的設置。CREATE DATABASE參數列表的其他部分可以省略,只要把數據庫的文件路徑附加到與原來數據庫分離時相同的文件路徑中。
10、WITH DB CHAINING ON|OFF
如果打開該選項,那么跨數據庫的所有權鏈有效,而關閉該選項,則所有權鏈無效。
11、TRUSTWORTHY
這個選項是新添加的選項,為訪問在SQL Server環境以外的系統資源和文件添加額外的安全層。例如,可能運行.NET程序集訪問網絡上的文件,如果這樣的話,那么必須檢查數據庫確保程序集是可以信賴的。由於安全原因,這個選項在默認情況下是關閉的-在確實明白您將要做的事情和原因之后,再打開這個選項。
示例:
CREATE DATABASE Accounting ON ( NAME = 'Accounting', --數據庫名稱 FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\AccountingData.mdf', --數據庫文件位置 SIZE = 10, --大小 10M MAXSIZE = 50, --最大大小 50M FILEGROWTH = 5 --每次增加 5M ) LOG ON ( NAME = 'AccountingLog', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\AccountingLog.ldf', SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB )
二、CREATE TABLE
創建表的具體語法:
CREATE TABLE Customers
詳細語法:
CREATE TABLE [database_name.[owner].]table_name ( <column name> <data type> [[DEFAULT <constant expression>] | [IDENTITY [(seed,increment) [NOT FOR REPLICATION]]]] [ROWGUIDCOL] [COLLATE <collation name>] [NULL|NOT NULL] --是否允許為空 [<column constraints>] --列約束 | [column_name AS compute_column_expression] | [<table_constraint>] --表約束 [,...n] ) [ON{<filegroup>|DEFAULT}] [TEXTIMAGE_ON{<filegroup>|DEFAULT}]
1、表名和列名
表名和列名的意思都懂,下面主要說命名標准。
1、對於名稱的每個單詞,要求首字母大寫,而其他字母小寫。
2、當名稱中有兩個單詞時,不要使用任何分隔符,通過將每個單詞首字母大寫來區分單詞。其實關於下划線,差別不大。順自己意願。
3、名稱盡量短,但是要限制縮寫,只有大家一看就看的明白的情況下才縮寫。當縮寫之后不容易看懂,不要縮寫。
4、當基於其他表來構建表時,需要在新的表名中包含所有父表的名稱。如電影表Movies與演員表Stars的關系表:MovieStars。
2、IDENTITY
在數據庫設計中,標識符就是SQL Server自動分配一個序號給插入的每個行。SQL Server開始計數的數字稱為種子值,而這個值隨着每行增加或減少的數量值稱為增量。默認情況下種子值為1,增量為1,很多設計要求不要改動設個默認設置,不過,也可以設定種子為3,增量為5等,這種情況下,將從3開始計數,然后每次加5。得到8、13、18、23等。
標識列必須是數值類型,在實際中,通常使用整型或大整型實現。
標識符最常見的用法是生成一個新值作為每行的標識符,即標識列通常用於創建表的主鍵,但是IDENTITY與PRIMARY KEY是不同的概念,即不會因為有一個IDENTITY列就說明這個值是唯一的(例如可以重復設置種子值,使用前面用過的值)。IDENTITY值通常用於PRIMARY KEY列,但並不是必須這樣使用。
3、NOT FOR REPLICATION
NOT FOR REPLICATION參數決定了當列發布到另一個數據庫時,是為新的數據庫分配一個新的標識列,還是保留已有的值。
4、ROWGUIDCOL
這個很像標識列,即用於唯一標識表的每行。當啟用ROWGUIDCOL后,SQL Server沒有采用數字技術,而是采用全局唯一標識符(Globally Unique Identifier)。這樣即使將兩張表的數據復制到一個表也沒有問題,因此GUID在空間和時間上都是唯一的。
5、COLLATE
這個選項與在CREATE DATABASE命令中的作用基本一樣,主要區別是作用范圍,這里是在列的層次而不是數據庫的層次定義的。
6、NULL/NOT NULL
這個選項說明指定列是否接受NULL值,在第一次安裝SQL Server時,默認的列值是NOT NULL,除非指定允許為空。
7、計算列
可以創建一個本身沒有任何數據的列,但列值是由表中其他列動態生成的。因為如果查詢時指定列值,能給應該帶來方便。
具體語法如下:
<column name> AS <computed column expression>
示例:
ExtendPrice AS Price * Quantity
在上面的例子中,ExtendPrice的值是根據Price和Quantity計算得來。
注意事項:
1、不能使用子查詢,而且值不能來自其他不同的表。
2、可以在計算列上創建索引,但是必須采用特定的步驟。
8、表約束
表約束和列約束很相似,都是對可以插入表中的數據進行限制。它們之間有一點不同的是:表約束可以基於多個列。
9、ON
在處理數據庫創建時,提到過可以創建不同的文件組,表定義中的ON子句就是用於指定希望表位於哪個文件組的一種方法。可以將給定的表放在一個特定的物理設備上,或者就按照大多數時候做的那樣,省略ON子句。
10、TEXTIMAGE_ON
這個選項和前面講到過的ON子句基本上相同,不同的是將該選擇將表的特定部分移動到不同的文件組中。這個子句只有在表的定義中有text、ntext或image時才有效。當使用TEXTIMAGE_ON子句時,只是將BLOB信息移動到分離的文件組中--表的其他部分還在默認文件組或者ON子句選擇的文件組中。
示例:
USE Accounting CREATE TABLE Customers { CustomerNo int IDENTITY NOT NULL, CostomerName varchar(30) NOT NULL, Address1 varchar(30) NOT NULL, Address2 varchar(30) NOT NULL, City varchar(20) NOT NULL State char(2) NOT NULL, Zip varchar(10) NOT NULL, Contact varchar(25) NOT NULL, Phone char(15) NOT NULL, FedIDNo varchar(9) NOT NULL, DateInSystem smalldatetime NOT NULL }
在CREATE代碼前面添加USE<database name>行,這樣能夠確保當運行腳本時,是在所指定的數據庫中創建表。
三、ALTER語句
與CREATE語句很相似,ALTER語句的開頭總有一樣的:
ALTER <object type> <object name>
1、ALTER DATABASE
具體語法如下:
ALTER DATABASE <database name> ADD FILE ([ NAME = <'logical file name'>,] FILENAME = <'file name'> [, SIZE = <size in KB,MB,GB or TB>] [, MAXSIZE = < size in KB,MB,GB or TB>] [, FILEGROWTH = <No of KB,MB,GB or TB | percentage>])
[,...n][ TO FILEGROUP filegroup_name] [, OFFLINE] |ADD LOG FILE ([ NAME = <'logical file name'>, ] FILENAME = <'file name'> [, SIZE = <size in KB,MB,GB or TB>] [, MAXSIZE = < size in KB,MB,GB or TB>] [, FILEGROWTH = <No of KB,MB,GB or TB | percentage>]) | REMOVE FILE <logical file name> [WITH DELETE] | ADD FILEGROUP <filegroup name> | REMOVE FILEGROUP <filegroup name> | MODIFY FILE <filespec> | MODIFY NAME = <new dbname> | MODIFY FILEGROUP <filegroup name> {<filegroup property> | NAME = <new filegroup name>} | SET <optionspec> [,...n][WITH <termination>] | COLLATE <collation name>
示例:將數據庫擴充至100MB:
ALTER DATABASE Accounting MODIFY FILE ( NAME = Accounting, SIZE = 100MB )
2、ALTER TABLE
具體語法:
ALTER TABLE table_name {[ALTER COLUMN <column_name> {[<schema of new data type>].<new_data_type>[(precision [,scale])] max | <xml schema collection> [COLLATE <collation_name>][NULL | NOT NULL] | [{ADD | DROP} ROWGUIDCOL] | PERSISTED}] |ADD <column name> <data_type> [[DEFAULT <constant_expression>] | [IDENTITY [(<seed>,<increment>)[NOT FOR REPLICATION]]]] [ROWGUIDCOL] [COLLATE <collation_name>] [NULL | NOT NULL] [<column_constraints>] |[<column_name> AS <computed_column_expression>] |ADD [CONSTRAINT <constraint_name>] {[{PRIMARY KEY | UNIQUE} [CLUSTERED | NONCLUSTERED] {(<column_name>[,...n])} [WITH FILLFACTOR = <fillfactor>] [ON {<filegroup> | DEFAULT}] ] |FOREIGN KEY [(<column_name>[,...n])] REFERENCES <referenced_table> [(<referenced_column>[,,,n])] [ON DELETE {CASCADE | NO ACTION}] [ON UPDATE {CASCADE | NO ACTION}] [NOT FOR REPLICATION] | DEFAULT <constant_expression> [FOR <column_name>] | CHECK [NOT FOR REPLICATOPM] (<search_conditions>) [,...n][,...n] |[WITH CHECK|WHTH NOCHECK] |{ENABLE | DISABLE } TRIGGER {ALL | <trigger name> [,...n]} |DROP {[CONSTRAINT] <constraint_name> |COLUMN <column_name>}[,...n] |{CHECK|NOCHECK} CONSTRAING {ALL|<constraint_name>[,...n]} |{ENABLE|DISABLE} TRIGGER {ALL|<trigger_name>[,...n]} | SWITCH [PARTITION <source partition number expression>] TO [ schema_name. ] target_table [PARTITION<target partition number expression>] }
太多了,實際上用不了這么多。下面給一些示例。
添加一個列:
ALTER TABLE Employees ADD PreviousEmployer varchar(30) NULL
執行以上語句后,語句是添加了,但是這些列是添加在列表的末尾,在SQL Server中沒辦法將列添加到特定位置。如果想將一個列移動到中間,那么需要創建一個全新的表,將數據復制到新表中,刪除已有的表,然后將表重新命名。
四、DROP語句
執行DROP語句與刪除在DROP語句中引用的任何對象一樣。這一操作快而簡單,其語法對於所有主要的SQL Server對象(表、視圖、存儲過程及觸發器)來說是相同的。語法如下所示:
DROP <object type> <object name> [,...n]
以下給出一個同時刪除兩個表的例子:
USE Accounting DROP TABLE Customer,Employess
刪除數據庫的例子:
USE master DROP DATABASE Accounting
如果返回錯誤,數據庫正在使用,不能刪除的話,要檢查一下兩個問題。
1、確保在Managerment Studio中的當前數據庫不是要刪除的數據庫。
2、確保沒有打開其他顯示要刪除的數據庫為當前數據庫的連接。