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