【问题标题】:How to add NOT NULL constraint along with default value for the column?如何添加 NOT NULL 约束以及列的默认值?
【发布时间】:2020-10-28 08:11:47
【问题描述】:

我在学生表中有一个“名称”列。我需要在此列上添加 NOT NULL 约束。但是我收到 SQL 错误说不能添加空约束,因为表中的现有行在列中有空值。如何在单个 alter 语句中添加空约束和默认值。以下是我的查询。

alter table Student alter column name nvarchar NOT NULL;

【问题讨论】:

  • 您必须先更新现有行。但是您可以使用不验证现有数据的NO CHECK 添加您的约束。

标签: sql sql-server


【解决方案1】:

SQL Server 并没有让这变得容易。我认为唯一的方法是将现有值设置为您想要的默认值。然后将列更改为具有默认值和not null

-- Get rid of the existing `NULL` values
update students set name = '' where name is null;

-- Add the NOT NULL constraint
alter table students
    alter column name varchar(255) not null;

-- Add a default value
alter table students
    add constraint df_t_name default '' for name ;

Here 是它在实践中的样子。

【讨论】:

    【解决方案2】:

    但我收到 SQL 错误提示无法添加空约束,因为表中的现有行在列中有空值。

    您是否尝试过覆盖现有的 NULL 值?

    当现有值违反该约束时,您不能对列进行约束。您需要首先使您的表符合要求。

    【讨论】:

    • 所以没有办法可以将默认值添加到现有列并在单个 ALTER 查询中添加 NOT NULL
    • @swetha 否。约束的目的是保证列中没有违反给定规则的值。如果有办法在存在违规值的情况下添加约束,那么约束将毫无用处。
    • 我通常会这样做 (1) UPDATE tbl SET col = 0 WHERE col IS NULL, (2) ALTER TABLE tbl ALTER COLUMN col int NOT NULL, (3) ALTER TABLE tbl ADD CONSTRAINT df_tbl_col DEFAULT(0) FOR col
    • @swetha - 否,因为仅在插入操作期间才考虑默认值。它不会追溯应用于插入空值的列(实际上,具有默认值的列是有效的,它也允许空值并且有一些)
    猜你喜欢
    • 2016-04-19
    • 1970-01-01
    • 2016-07-08
    • 2017-09-07
    • 2018-01-25
    • 2020-12-13
    • 2011-01-06
    • 2011-03-11
    • 2012-04-08
    相关资源
    最近更新 更多