<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 Accounting

ALTER 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)