添加默认值时仍返回NULL

时间:2017-12-02 22:31:53

标签: sql sql-server

我试图用默认值'NO'替换NULL,但即使我执行它,当我尝试查看数据时它仍然显示NULL。我已经尝试在列上删除约束,但它不起作用

/*------------------------
use AuntieB
--alter table charity
--  add STORE char(10);
--update charity
--set STORE = 'YES'
--where Name = 'Salvation Army' or Name = 'Mother Wattles' or Name = 'Fresh Start Charity'
alter table charity
    add default 'No' for STORE;
select * from charity
------------------------*/
  CharityID Name                 Address                        City                           State Zip        Phone          ContactID STORE
----------- -------------------- ------------------------------ ------------------------------ ----- ---------- ------------ ----------- ----------
       1000 St. Francis Home     45875 West. Hill St.           Utica                          MI    48045      586-795-3486        1025 NULL
       1001 Helping Hands        98563 Stadium                  Detriot                        MI    48026      313-978-6589        1030 NULL
       1002 Boy Scouts           1155 E. Long Lake Rd           Troy                           MI    48085      248-253-9596        1036 NULL
       1003 Focus Hope           54362 Grand River              Detroit                        MI    48312      313-478-7895        1041 NULL
       1004 Fresh Start Charity  12569 Gratiot Ave.             Roseville                      MI    48084      555-555-2035        1046 YES       
       1005 St. John Hospital    59652 Shelby Rd.               Shelby Twp.                    MI    48317      586-569-6987        1050 NULL
       1006 Salvation Army       56231 Somewhere Blvd.          Eastpointe                     MI    48021      586-555-1212        1056 YES       
       1007 LA Angels Traders    2468 Halo Park Dr South        Los Angelas                    MI    90234      903-965-3556        2015 NULL
       1008 Purple Heart         28765 Van Dyke                 Sterling Heights               MI    48313      586-732-8723        1061 NULL
       1009 St. Raja Home        45875 West. Hill St.           Utica                          MI    48045      586-795-3486        1062 NULL
       1010 Mother Wattles       4568 Griswold                  Detroit                        MI    48205      313-478-9856        2016 YES       
       1011 Ron McDonald House   649 West Road                  Utica                          MI    48045      586-795-9979        1030 NULL
       1012 St. Jude             262 Danny Thomas Place         Memphis                        MI    38105      800-822-6344        1030 NULL

(13 rows affected)

3 个答案:

答案 0 :(得分:3)

来自docs

  

将DEFAULT定义添加到表中的现有列时,默认情况下,数据库引擎仅将新的默认值应用于添加到表中的新数据行。使用以前的DEFAULT定义插入的现有数据不受影响。但是,在向现有表添加新列时,可以指定数据库引擎将缺省值(由DEFAULT定义指定)而不是空值插入到表中现有行的新列中。 / p>

因此,在将DEFAULT定义添加到现有列时,您需要自己填充现有行。

答案 1 :(得分:1)

您无法在现有列中添加新的默认约束,并在同一DDL操作中更新退出的NULL值。您需要在之后将值NULL显式更新为所需的值。

但是,您可以添加具有默认约束的新列,并通过指定WITH VALUES子句将默认值应用于所有现有行:

ALTER TABLE dbo.charity
    ADD store char(10) NULL
    CONSTRAINT df_charity_STORE DEFAULT 'No'
    WITH VALUES;

此方法也允许您添加新的NOT NULL列。

如果您运行的是SQL Server的Enterprise(或Developer)版本,WITH VALUES是一个仅限元数据的操作,它可以避免在操作期间内部更新表中的每一行。该操作在实际版本中物理更新表中的每一行。

答案 2 :(得分:0)

这里有两种选择。您可以像这样更新所有空值;

update charity
set STORE = 'NO'
where STORE is null

或者如果只想在选择空值时替换空值,可以使用ISNULL语句。

select ISNULL(STORE,'NO') from charity

此外,为现有列添加具有默认值的约束不会更新以前的数据。它为新的行设置默认值。