位类型:默认为 '0' 而不是 NULL

Posted

技术标签:

【中文标题】位类型:默认为 \'0\' 而不是 NULL【英文标题】:bit type : default to '0' instead of NULL位类型:默认为 '0' 而不是 NULL 【发布时间】:2017-10-15 05:46:19 【问题描述】:

默认情况下,sql server 为boolean 字段分配一个NULL 值。 我如何告诉它默认使用'0'? 我尝试将默认值设置为 ((0)) 但它仍然存在于 NULL 上。

【问题讨论】:

你能显示你的表定义吗? 不,SQL Server 默认使用 NULL,除非该列可以为空。如果您在可为空的列中插入 NULL,您将得到一个空值,而不是默认值。如果您显式插入 NULL,您将始终获得默认值。 您要允许明确的NULL 值吗?如果没有,将列标记为not null 似乎很简单。 发布你的表定义AND你用来插入数据的代码。如果你得到一个 NULL,要么你没有指定一个默认值,要么你明确地存储了一个 NULL 值 @user763539 - 使用 Tanner 的答案,但更改列定义以允许空值,它仍然输出 01。因此,无论您在做什么,它都不是最明显的事情,因此您需要创建一个小代码示例来演示一个带有默认值和插入的表这会导致插入 null 而不是默认值。 【参考方案1】:

这是一个示例,其中包含一个不可为空的位列并指定了默认值,只需在 Management Studio 中运行以下命令:

CREATE TABLE #temp
    (
      id INT ,
      myBit BIT NOT NULL DEFAULT 0  -- not null with default of false
    );

INSERT  INTO #temp
        ( id )  -- only insert to id col, the default will set itself
VALUES  ( 123 );

INSERT INTO #temp
        ( id, myBit )
VALUES  ( 456, 1 )  -- this insert adds a true value to override the default

SELECT  *
FROM    #temp;

DROP TABLE #temp;

生产:

id  myBit
123 0
456 1

【讨论】:

【参考方案2】:

ALTER TABLE 表名 ADD 列名 BIT NOT NULL DEFAULT 0;

【讨论】:

OP 提到默认的 已指定 但“不起作用”。 OP在表定义或INSERT语句中可能有不同的问题 @Alexey Varentsov 我在管理工作室做过,但它仍然在新记录上恢复为空。【参考方案3】:

我建议指定默认名称,否则生成的名称不会告诉您有关已创建约束的任何信息,请参见下面的示例:

CREATE TABLE TBL_SAMPLE
(
    ID INT NOT NULL CONSTRAINT [PK_ID] PRIMARY KEY,
    BIT_COLUMN BIT NOT NULL CONSTRAINT [DF_BIT_COLUMN] DEFAULT (0)
)
GO


INSERT INTO TBL_SAMPLE (ID)
VALUES (1)
GO

SELECT * FROM TBL_SAMPLE
GO

DROP TABLE TBL_SAMPLE
GO

编辑:

CREATE TABLE #TBL_SAMPLE 
(
    ID INT NOT NULL CONSTRAINT [PK_ID] PRIMARY KEY,
    BIT_COLUMN BIT NULL --CONSTRAINT [DF_BIT_COLUMN] DEFAULT (0) 
) 
GO


INSERT INTO #TBL_SAMPLE (ID) VALUES (1) 
GO

SELECT * FROM #TBL_SAMPLE 
GO

ALTER TABLE #TBL_SAMPLE ADD CONSTRAINT [DF_BIT_COLUMN] DEFAULT (0) FOR BIT_COLUMN 
GO


INSERT INTO #TBL_SAMPLE (ID) VALUES (2) 
INSERT INTO #TBL_SAMPLE (ID) VALUES (3) 
GO

SELECT * FROM #TBL_SAMPLE 
GO

UPDATE #TBL_SAMPLE 
SET BIT_COLUMN = 0 
WHERE BIT_COLUMN IS NULL

SELECT * FROM #TBL_SAMPLE 
GO

DROP TABLE #TBL_SAMPLE 
GO

【讨论】:

不幸的是:ALTER TABLE mytable ADD CONSTRAINT No_Nulls DEFAULT 0 FOR myfield;不管用。 SQL Server 坚持将 NULL 分配给所有布尔字段(位)。它不会让我分配我自己的价值。当我转到新行时,所有字段仍显示 NULL 作为默认值。 @user763539,不确定您的期望。设置默认值不会更改现有行的值,它只会将默认值分配给新行。对于现有值,您需要进行更新。请参阅我编辑的答案。 @user763539 “当我转到新行时,所有字段仍显示 NULL 作为默认值。”。您只是在谈论 SSMS 中的内联表格编辑器吗?如果是这样,那么只需忽略相关字段即可。一旦您实际插入该行,它将获得默认值。 @ADyson 问题是 sql 服务器在开始时将所有值设置为 NULL。只有在您添加记录后,它才会将它们更改为所需的值然后发布。我的程序在 post 之前获取现有值(当然读取为 null)。然后我遇到转换错误。如何移动到管理工作室中的新行,以便已经可以看到显示的默认值? 我的程序在 post 之前获取现有值(当然读取为 null)。 那么问题在于您的应用程序逻辑。当您的应用程序“添加”一个新行供用户编辑时,您的应用程序将“覆盖”任何默认值,因为该行在表中尚不存在。因此,当用户保存这一新行时,它只是使用表单中的所有值插入该行——其中一些用户可能从未接触过。所以从不使用列的默认值。【参考方案4】:

请添加后缀WITH VALUES,如下所示。效果很好:

ALTER TABLE (your table) 
ADD (your column) [bit] NULL DEFAULT 1 WITH VALUES;

【讨论】:

这似乎是正确的解决方案,但我猜你的意思是 0 作为默认值而不是 1(见问题)? 使用“WITH VALUES”是这里的实际解决方案,但令人惊讶的是,这个解决方案被评为负面:D【参考方案5】:

ALTER TABLE (表名) ADD (列名) BIT NOT NULL DEFAULT 0;

【讨论】:

以上是关于位类型:默认为 '0' 而不是 NULL的主要内容,如果未能解决你的问题,请参考以下文章

如何判断一个int类型是不是为空

c语言NULL是啥意思?

如何datetime数据类型是不是为空?

sql server中表达式null=0的值是

vuejs的template怎么判断option的值是不是为null或者空数组

C#z中怎么判断一个iNt数据是不是为空