官术网_书友最值得收藏!

3.3 命令方式創建表結構

用命令方式同樣可以創建表結構、修改表結構和刪除表。

3.3.1 創建表結構:CREATE TABLE

創建表使用CREATE TABLE命令,其語法格式如下:

  CREATE TABLE [數據庫名. [架構名] . | 架構名. ]表名
  (
     <列定義>
     ……
     [ <表約束> ]
  )  ……

其中,<列定義>為:

     列名 數據類型                                          / *指定列名、列的數據類型* /
     [ FILESTREAM ]                                       / *指定FILESTREAM屬性* /
     [ COLLATE排序名]                                      / *指定排序規則* /
     [ NULL | NOT NULL ]                                  / *指定是否為空* /
     [
         [ CONSTRAINT約束名]
         DEFAULT常量表達式                                  / *指定默認值* /
     ]
     | [ IDENTITY [ (初值, 增量) ] [ NOT FOR REPLICATION ]] / *指定列為標識列* /
     [ ROWGUIDCOL ]                                        / *指定列為全局標識符列* /
     [ <列約束> … ]                                         / *指定列的約束* /

說明

(1)FILESTREAM:它允許以獨立文件的形式存放大對象數據,而不是像以往一樣將所有數據都保存到數據文件中。

(2)NULL | NOT NULL:NULL表示列可以取空值,NOT NULL表示列不可以取空值。

(3)DEFAULT常量表達式:為所在列指定默認值,默認值“常量表達式”必須是一個常量值、標量函數或NULL值。DEFAULT定義可適用于除定義為timestamp或帶identity屬性的列以外的任何列。

(4)IDENTITY:指出該列為標識符列,為該列提供一個唯一的、遞增的值。“初值”是標識字段的起始值,默認值為1;“增量”是標識增量,默認值為1。如果為IDENTITY屬性指定了NOT FOR REPLICATION選項,則復制代理執行插入時,標識列中的值將不會增加。

(5)ROWGUIDCOL:表示新列是行的全局唯一標識符列,ROWGUIDCOL屬性只能指派給uniqueidentifier列。該屬性并不強制列中所存儲值的唯一性,也不會為插入到表中的新行自動生成值。

(6)<列約束>:列的完整性約束,指定主鍵、替代鍵、外鍵等。例如,指定該列為主鍵則使用PRIMARY KEY關鍵字。

注意

SQL Server中創建的表通常稱為持久表。在數據庫中持久表一旦創建將一直存在,多個用戶或者多個應用程序可以同時使用持久表。有時需要臨時存放數據,例如,臨時存儲復雜的SELECT語句的結果。此后,可能要重復地使用這個結果,但這個結果又不需要永久保存,這時,可以使用臨時表。用戶可以像操作持久表一樣操作臨時表。只不過臨時表的生命周期較短,當斷開與該數據庫的連接時,服務器會自動刪除它們。

在表名稱前添加“#”或“##”符號,創建的表就是臨時表,添加“#”符號表示創建的是本地臨時表,只能由創建者使用。添加“##”符號表示創建的是全局臨時表,可以由所有的用戶使用。

【例3.1】設已經創建了數據庫test1,現在該數據庫中需創建學生情況表xsb1,該表的結構如表3.3所示。

在“SSMS”中單擊“新建查詢”,在“查詢編輯器”中輸入下列T-SQL命令(見圖3.2)。

  USE test1
  GO
  CREATE TABLE xsb1
  (
      學號      char(6)      NOT NULL PRIMARY KEY,
      姓名      char(8)      NOT NULL,
      性別      bit          NULL DEFAULT 1,
      出生時間  date         NULL,
      專業      char(12)     NULL DEFAULT ‘計算機’,
      總學分    i nt         NULL DEFAULT 0,
      備注      varchar(500) NULL
  )
  GO

因為當前數據庫是“xscj”,使用USE test1語句將數據庫test1指定為當前數據庫,然后使用CREATE TABLE語句在該數據庫中創建表xsb1。如果在“SSMS”中當前的數據庫為“test1”,則不需要使用USE test1語句。

執行命令后,在test1數據庫中就創建了xsb1表,并且當前數據庫變成了“test”,此后在test1數據庫中操作不需要使用“USE test1”命令。

圖3.2 執行結果

【例3.2】創建一個帶計算列的表“pcj”,表中包含課程的課程號、總成績和學習該課程的人數,以及課程的平均成績。

  CREATE TABLE pcj
  (
      課程號    char(3)   PRIMARY KEY,
      總成績    real      NOT NULL,
      人數      int       NOT NULL,
      平均成績AS總成績/人數PERSISTED
  )

說明

如果沒有使用PERSISTED關鍵字,則在計算列上不能添加PRIMARY KEY、UNIQUE、DEFAULT等約束條件。由于計算列上的值是通過服務器計算得到的,因而在插入或修改數據時不能對計算列賦值。

3.3.2 修改表結構:ALTER TABLE

修改表結構可以使用ALTER TABLE命令,語法格式如下:

  ALTER TABLE [數據庫名.[架構名]. | 架構名. ]表名
  {
      ALTER COLUMN列名{…}                          / *修改已有列的屬性* /
      | ADD                                        / *添加列* /
      {
          <列定義>
          | 列名AS表達式[PERSISTED [NOT NULL]]     / *定義計算列* /
          | <表約束>
      } [ , … ]
      | DROP
      {
          [ CONSTRAINT ]約束名                     / *刪除約束* /
          [ WITH ( <刪除聚集約束選項>   … ) ]
          | COLUMN列名                             / *刪除列* /
      } [ , … ]
      | [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT { ALL | 約束名 }
      ……
  }

1. 命令主體

ALTER TABLE命令主體結構說明如下。

(1)表名:要修改的表名。

(2)ALTER COLUMN子句:修改表中指定列的屬性,“列名”給出要修改的列。

若表中該列所存數據的數據類型與將要修改的列類型沖突,則發生錯誤。例如,原來char類型的列要修改成int類型,而原來列值包含非數字字符,則無法修改。

(3)ADD子句:向表中增加新列,新列的定義方法與CREATE TABLE命令中定義列的方法相同。一次還可以添加多個列,中間用逗號隔開。

(4)DROP子句:從表中刪除列或約束。

注意

在刪除一個列以前,必須先刪除基于該列的所有索引和約束。

(5)WITH子句:[WITH{CHECK|NOCHECK}]指定表中的數據是否用新添加的或重新啟用的FOREIGN KEY或CHECK約束進行驗證。ALL關鍵字指定啟用或禁用所有約束。有關FOREIGNKEY和CHECK約束的內容將在后面章節專門介紹。

2. ALTER COLUMN子句

該子句的內容格式為:

  ALTER COLUMN列名
  {
      類型名[ ( 精度[ , 位數] ) ]
      [ COLLATE排序名]
      [ NULL | NOT NULL ]
      ……
  }

(1)類型名:為被修改列的新的數據類型。當要修改成數值類型時,可以使用“( 精度[ ,位數] )”分別指定數值的精度和小數位數。

(2)[NULL | NOT NULL]:表示將列設置為是否可為空,設置成NOT NULL時要注意表中該列是否有空數據。

【例3.3】在test1數據庫xsb1表中增加“入學時間”列。

在SSMS中新建一個查詢,并輸入如下腳本:

  USE test1
  GO
  ALTER TABLE xsb1
      ADD入學時間date
  GO

輸入完成后執行該腳本,然后可以在“對象資源管理器”中展開“xscj”中表dbo.xsb的結構查看執行結果。如果原表中已經存在和添加列同名的列,則語句運行將出錯。

【例3.4】修改表xsb1中已有列的屬性:將名為“姓名”的列長度由原來的8改為10;將名為“入學時間”的列的數據類型由原來的date改為small datetime。

新建一個查詢,在查詢分析器中輸入并執行如下腳本:

  ALTER TABLE xsb1
      ALTER COLUMN姓名char(10)
  GO
  ALTER TABLE xsb1
      ALTER COLUMN入學時間smalldatetime
  GO

說明

在ALTER TABLE語句中,一次只能包含ALTER COLUMN、ADD、DROP子句中的一條。而且使用ALTER COLUMN子句時一次只能修改一個列的屬性,所以這里需要使用兩條ALTER TABLE語句。

如果刪除“入學時間”列,則命令如下:

  ALTER TABLE xsb1
      DROP COLUMN入學時間
  GO

3.3.3 刪除表:DROP TABLE

語法格式:

  DROP TABLE [數據庫名.[架構名]. | 架構名. ] 表名[ , ... ] [ ; ]

其中,“表名”是要被刪除的表的名稱。刪除表后,數據庫中不再存在(包括表結構)。

例如,刪除test1數據庫中的pcj表。命令如下:

  DROP TABLE pcj
主站蜘蛛池模板: 东兰县| 青川县| 名山县| 五大连池市| 博客| 从化市| 新闻| 昂仁县| 区。| 屯昌县| 东安县| 丹棱县| 开平市| 临桂县| 泸西县| 合江县| 梅州市| 阳城县| 阿瓦提县| 潼关县| 浦城县| 三都| 兴安县| 沁水县| 威海市| 香港 | 四川省| 铁力市| 海兴县| 乐昌市| 四平市| 北流市| 绥中县| 会东县| 康平县| 壤塘县| 山阳县| 永和县| 招远市| 仪陇县| 东乡族自治县|