SQL Server表结构变更给表添加列且设置默认值

在设计表结构的时候并不能够完全考虑到所有情况或者业务逻辑变更,往往这个时候就需要修改表结构,比如给表添加新列并且设置默认值,这样历史数据的值就不用再更新了。本文主要参考stackoverflow:add-a-column-with-a-default-value-to-an-existing-table-in-sql-server,该问题主要讲解了再SQL Server数据库中给现有的表添加列并且设置默认值,其他数据库操作基本类似。

原问题:

SQL Server 2000、SQL Server 2005中如何给表添加列并且设置默认值?

采纳答案:

基本语法:

ALTER TABLE {TABLENAME} 
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} 
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES

示例:

ALTER TABLE SomeTable
        ADD SomeCol Bit NULL --Or NOT NULL.
 CONSTRAINT D_SomeTable_SomeCol --When Omitted a Default-Constraint Name is autogenerated.
    DEFAULT (0)--Optional Default-Constraint.
WITH VALUES --Add if Column is Nullable and you want the Default Value for Existing Records.

注意事项:

可选参数CONSTRAINT_NAME
如果不设置CONSTRAINT D_SomeTable_SomeCol系统会自动生成一个值,比如DF__SomeTa__SomeC__4FB7FEF6

可选参数WITH VALUES:
如果新增的列可以为NULL值,且希望历史的数据的值都为默认值,则需要添加with values参数。

-- somirror制作 
-- 文章地址:https://somirror.com/?p=600 
create table Table_A(id int,col1 varchar(10),col2 varchar(10)); 
insert into Table_A(id, col1, col2) 
values 
(1,'A','B'), 
(2,'A','B'); 
select * from Table_A; 
alter table Table_A 
add col3 varchar(10) NULL 
default ('C') 
with values; 
select * from Table_A;
with values
运行结果

如果新增的列可以为NULL值,且希望历史的数据的值都为NULL,则不需要添加 with values参数。

-- somirror制作 
-- 文章地址:https://somirror.com/?p=600 
create table Table_B(id int,col1 varchar(10),col2 varchar(10)); 
insert into Table_B(id, col1, col2) 
values 
(1,'A','B'), 
(2,'A','B'); 
select * from Table_B; 
alter table Table_B 
add col3 varchar(10) NULL 
default ('C'); 
select * from Table_B;

如果新增的列不可以为NULL值即设置NOT NULL,则无论是否添加with values参数,历史数据都会使用默认值。

-- somirror制作 
-- 文章地址:https://somirror.com/?p=600 
create table Table_C(id int,col1 varchar(10),col2 varchar(10)); 
insert into Table_C(id, col1, col2) 
values 
(1,'A','B'), 
(2,'A','B'); 
select * from Table_C; 
alter table Table_C 
add col3 varchar(10) NOT NULL 
default ('C'); 
select * from Table_C;
-- somirror制作 
-- 文章地址:https://somirror.com/?p=600 
create table Table_D(id int,col1 varchar(10),col2 varchar(10)); 
insert into Table_D(id, col1, col2) 
values 
(1,'A','B'), 
(2,'A','B'); 
select * from Table_D; 
alter table Table_D 
add col3 varchar(10) NOT NULL 
default ('C') 
with values; 
select * from Table_D;

添加Default属性后,插入数据的表现:

如果插入语句的时候没有指定值,则使用默认值。
如果插入语句的时候指定为NULL值,且改列设置为NOT NULL,则插入的为NULL值

-- somirror制作
-- 文章地址:https://somirror.com/?p=600
create table Table_E(id int,col1 varchar(10),col2 varchar(10));

insert into Table_E(id, col1, col2)
values
(1,'A','B'),
(2,'A','B');

select * from Table_E;

alter table Table_E
add col3 varchar(10) NULL
default ('C')
with values;

select * from Table_E;

insert into Table_E values(4,'A','B',NULL)

select * from Table_E;

查看SQL语句并进行验证。

本文根据StackOverflow翻译而来,不代表烟海拾贝立场,如若转载,请注明出处:https://somirror.com/600.html

(1)
上一篇 2022-02-24 20:01
下一篇 2022-02-25 16:26

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注