<p>比修改数据库更为常见的情景是需要修改表的结构,其所包括的内容范围很广,从添加新列到修改数据类型等复杂问题。</p>
以下是修改表的基本语法:
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 REPLICATION] (<search_conditions>) [, ..n][, ...n] |[WITH CHECK|WITH NOCHECK] | {ENABLE | DISABLE } TRIGGER { ALL | <trigger name> [, ...n]} |DROP {[CONSTRAINT] <constraint_name> |COLUMN <column_name>} [, ...n] |{CHECK|NOCHECK} CONSTRAINT {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 DateOfBirth datetime NULL, LastRaiseDate datetime NOT NULL DEFAULT '2008-01-01'
需要注意的是添加的列都在列的末尾。在SQL Server中,没办法将列添加到特定的位置。如果想将一个列移到中间,那么需要创建一个全新的表(采用一个不同的名称),将数据复制到新表中,删除已有的表,然后将新表重命名。
ALTER TABLE对视图的影响:即使视图是使用SELECT *作为基本语句来构建的,在重新构建视图前,新列不会在视图中出现。由于性能方面的原因,视图中的列名称是在视图创建时解析的,这意味着在添加列时已创建的视图已经使用原来的列列表解析了——必须要么先删除视图后再重新创建视图,要么使用ALTER VIEW语句重新构造视图。
下面是另一个示例,它给已经存在的表设置主键,并且创建添加主键约束:
USE AccountingALTER TABLE Employees ADD CONSTRAINT PK_EmployeeID PRIMARY KEY (EmployeeID);
ALTER TABLE 命令告诉SQL Server下列信息:
- 添加了一些内容到表中(也可以删除表中的某些内容)
- 添加了什么内容(一个约束)
- 对约束的命名(允许以后直接访问约束)
- 约束的类型(主键约束)
- 约束应用于哪个列
以下示例给已存在的表添加一个外键:
ALTER TABLE Orders ADD CONSTRAINT FK_EmployeeCreatesOrder FOREIGN KEY (EmployeeID) REFERENCES Employees(EmployeeID)