【问题标题】:How to insert null value to NOT NULL column using the DEFAULT Constraint如何使用 DEFAULT 约束将空值插入 NOT NULL 列
【发布时间】:2017-09-24 05:54:01
【问题描述】:

这是我的示例表定义:

CREATE TABLE [MyTable] 
(
    [ColumnName] [bit] NOT NULL
)

ALTER TABLE [MyTable] ADD DEFAULT ((0)) FOR [ColumnName]

我希望能够将Null 值传递给我的存储过程的@ColumnValue,类似于:

@ColumnValue = null;

INSERT INTO [MyTable] ([ColumnName])
VALUES (@ColumnValue)

但是我收到了这个错误:

“无法将值 NULL 插入列... INSERT 失败”

为什么DEFAULT 约束不起作用?

【问题讨论】:

  • 如果请求的插入没有为该字段指定值,则将插入默认值。您正在为该字段指定 NULL。如果可能,修改您的插入以完全排除该字段,或修改执行插入的应用程序以了解并提供默认值。

标签: sql sql-server tsql


【解决方案1】:

已解决:

作为@J.D.佩斯说:只有在Insert语句中没有指定值时才会插入默认值。

正如@dotNET 建议的那样,我已经使用ISNULLINSERT 查询语句中指定了默认值:

ISNULL - SQL Server ISNULL() 函数允许您在表达式为 NULL 时返回替代值:

@ColumnValue = null;

INSERT INTO [MyTable] (
    [ColumnName]
)
VALUES (
    ISNULL(@ColumnValue, 0)
)

【讨论】:

    【解决方案2】:

    只有一列 bit 类型的默认值的表似乎是一个糟糕的设计。这些东西几乎肯定可以以不同的更好的方式存储。另一方面,如果表中还有其他列未包含在帖子中,只需在 INSERT 查询中跳过此特定列,它就可以正常工作。最后,您也可以在 INSERT 查询中指定默认值。

    【讨论】:

    • 这只是示例,我不能跳过该列,因为它是传递给我的存储过程参数的值
    • 你不能在你的SP中使用IF/ELSE,如果传递的参数是NULL或非NULL,使用两个不同的查询。
    猜你喜欢
    • 2020-04-15
    • 2020-01-21
    • 2017-12-27
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    相关资源
    最近更新 更多