本文章为 SQL Server 的详细学习大纲 里面的一个子章节的详细介绍,如果了解相关的其他内容,可以从这里面查看,或者查看SQL Server专栏,里面有些文章可能并不在 SQL Server 的详细学习大纲 里面,是一些补充内容。
1. 添加列
- 基本语法:
ALTER TABLE [table_name] ADD [column_name] [data_type] [column_constraint];
- 示例:
- 假设已经有一个名为
Employees
的表,包含EmployeeID
、EmployeeName
和Department
列。现在要添加一个新列HireDate
,数据类型为date
,可以使用以下语句:-
ALTER TABLE Employees ADD HireDate date;
-
- 如果要添加带有约束条件的列,例如添加一个
Email
列,数据类型为varchar(100)
,并且要求该列的值唯一,可以使用以下语句:-
ALTER TABLE Employees ADD Email varchar(100) UNIQUE;
-
- 假设已经有一个名为
2. 删除列
- 基本语法:
ALTER TABLE [table_name] DROP COLUMN [column_name];
- 示例:
- 若要从
Employees
表中删除Email
列,可以使用以下语句:-
ALTER TABLE Employees DROP COLUMN Email;
-
- 注意,在删除列之前,需要确保没有其他对象(如视图、存储过程等)依赖于该列,否则可能会导致相关对象的操作出现错误。
- 若要从
3. 修改列的数据类型
- 基本语法:
ALTER TABLE [table_name] ALTER COLUMN [column_name] [new_data_type];
- 示例:
- 假设
Employees
表中的EmployeeID
列最初的数据类型为int
,现在要将其修改为bigint
,可以使用以下语句:-
ALTER TABLE Employees ALTER COLUMN EmployeeID bigint;
-
- 有些数据类型的转换可能会导致数据丢失或者出现错误。例如,将一个包含较大数值的
int
列转换为tinyint
(范围是0 - 255)可能会导致数据溢出问题。在进行数据类型修改时,需要谨慎考虑数据的兼容性。
- 假设
4. 修改列的约束条件
- 添加约束
- 基本语法(以添加主键约束为例):
ALTER TABLE [table_name] ADD CONSTRAINT [constraint_name] PRIMARY KEY ([column_name]);
- 示例:
- 如果
Employees
表最初没有定义EmployeeID
为主键,现在要添加主键约束,可以使用以下语句:-
ALTER TABLE Employees ADD CONSTRAINT PK_Employees_EmployeeID PRIMARY KEY (EmployeeID);
-
- 如果
- 基本语法(以添加主键约束为例):
- 删除约束
- 基本语法(以删除主键约束为例):
ALTER TABLE [table_name] DROP CONSTRAINT [constraint_name];
- 示例:
- 假设
Employees
表中的EmployeeID
有主键约束,约束名称为PK_Employees_EmployeeID
,要删除该主键约束,可以使用以下语句:-
ALTER TABLE Employees DROP CONSTRAINT PK_Employees_EmployeeID;
-
- 假设
- 基本语法(以删除主键约束为例):
- 修改约束(以修改列的非空约束为例)
- 若要将
Employees
表中EmployeeName
列的非空约束修改为允许为空,可以先删除原有的非空约束,再根据需要重新添加约束。 - 删除非空约束:
-
ALTER TABLE Employees ALTER COLUMN EmployeeName varchar(100) NULL;
-
- 重新添加非空约束(如果需要):
-
ALTER TABLE Employees ALTER COLUMN EmployeeName varchar(100) NOT NULL;
-
- 若要将
- 查看表的所有约束
SELECT
OBJECT_SCHEMA_NAME(kc.parent_object_id) AS SchemaName, -- 表所属架构名
OBJECT_NAME(kc.parent_object_id) AS TableName, -- 表名
c.name AS ColumnName, -- 列名
kc.name AS ConstraintName -- 主键约束名称
FROM
sys.key_constraints kc
JOIN
sys.index_columns ic ON kc.parent_object_id = ic.object_id AND kc.unique_index_id = ic.index_id
JOIN
sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
5. 注意事项
- 备份数据:在对表结构进行修改之前,特别是涉及到可能会影响数据的操作(如修改数据类型、删除列等),最好先备份表中的数据,以防数据丢失或损坏。
- 影响其他对象:修改表结构可能会对依赖该表的其他数据库对象(如视图、存储过程、函数等)产生影响。例如,删除列可能会导致引用该列的视图或存储过程出现错误,需要对这些对象进行相应的修改。
- 性能考虑:某些表结构的修改操作(如添加或删除索引相关的约束)可能会对数据库的性能产生较大的影响。在生产环境中进行此类操作时,需要考虑在适当的时间(如系统负载较低的时候)进行。