SQL Server 2016 数据库教程(第4版)
上QQ阅读APP看书,第一时间看更新

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