比修改数据库更为常见的情景是需要修改表的结构,其所包括的内容范围很广,从添加新列到修改数据类型等复杂问题。
以下是修改表的基本语法:
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)