日期:2014-05-19  浏览次数:20619 次

sql联机从书里的一个例了,我对它所讲的 WITH VALUES 这个关键字不明白起什么用?
F.   添加具有默认值的可为空的列
下例添加可为空的、具有   DEFAULT   定义的列,并使用   WITH   VALUES   为表中的各现有行提供值。如果没有使用   WITH   VALUES,那么每一行的新列中都将具有   NULL   值。

ALTER   TABLE   MyTable  
ADD   AddDate   smalldatetime   NULL
CONSTRAINT   AddDateDflt
DEFAULT   getdate()   WITH   VALUES


有没有这个WITH   VALUES   都不起用啊?
例:
CREATE   TABLE   tbl_test
(
        t_id         INT,
        t_name     CHAR(10)
)
GO
ALTER   TABLE   tbl_test
        ADD   t_address   NULL
        CONSTRAINT   DF_t_address  
        DEFAULT( 'UNKONWN ')   WITH   VALUES
GO

我的理解:
INSERT   INTO   tbl_test   VALUES(1, 'mike ',NULL)
因为用了   WITH   VALUES   所以当我在t_address   这个列上插入NULL后,由于t_address有WITH   VALUES   这个关键字,虽然我插入的是NULL,但是它会变成 'UNKNOWN '这个默认值,但是结果不是这样!!!它还是得到NULL??
WITH   VALUES,我该怎么理解??

------解决方案--------------------
如下情况:
1、你建立的一个表;
2、然后你发现表少了一个字段;
3、于是你想给它加字段,并且想给这个字段加个默认值;
于是
alter table tbname add col2 int default 0 with values
就是在添加这个列的同时给这个字段赋默认值 0
以后新增的行如果没有显示的插入这个字段的值,则赋予默认值0,若有显示赋值,则不取默认值。

------解决方案--------------------
with values 是针对旧记录的

楼上的说法应该稍改一下:
-- 1. 建立表
create table tb(id int)

-- 2. 插入记录
insert tb values(1)

-- 3. 发现少了字段, 准备添加一个, 并且默认值为 0, 并且以前的记录该列也要有默认值
ALTER TABLE tb ADD col1 int DEFAULT(0) WITH VALUES

-- 4. 发现少了字段, 准备添加, 默认值为0
ALTER TABLE tb ADD col2 int DEFAULT(0)

-- 5. 显示结果
SELECT * FROM tb