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.   

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

  2.   

    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
      

  3.   

    -- 结果如下(由此可见有无 WITH VALUES 的差异)id          col1        col2
    ----------- ----------- -----------
    1           0           NULL(1 行受影响)
      

  4.   

    于是 
    alter table tbname add col2 int default 0 with values
    就是在添加这个列的同时给这个字段赋默认值 0 
    ---------------------------------------------------------
    也就是一楼的这句有点拗口
        DEFAULT 就是给字段赋默认值的, 它是长期生效的
        而 WITH VALUES 是处理已经存在的记录的, 它仅是在 ALTER 时起作用的