【问题标题】:MS SQL explicitly using "default defaults" on NOT NULL fields - why?MS SQL 在 NOT NULL 字段上显式使用“默认默认值” - 为什么?
【发布时间】:2016-06-21 13:20:30
【问题描述】:

我偶然发现了这个定义:

CREATE TABLE dbo.whatever (
  [flBlahBlah]  BIT           DEFAULT ((0)) NOT NULL,
  [txCity]      NVARCHAR (50) DEFAULT ('') NOT NULL,
  [cdFrom]      VARCHAR (10)  DEFAULT ('') NOT NULL
);

我想不出添加这些默认值的理由。非空字符串默认为'',位默认为0。是否有定义这些默认值的理由?我错过了什么吗?这在我不知道的一些最佳实践手册中吗?

我只是使用:

CREATE TABLE dbo.whatever (
  [flBlahBlah]  BIT           NOT NULL,
  [txCity]      NVARCHAR (50) NOT NULL,
  [cdFrom]      VARCHAR (10)  NOT NULL
);

数据库位于 MS SQL Server 2012 中,现在正在迁移到 Azure 数据库。

【问题讨论】:

  • 因为VARCHAR NOT NULL 没有'' 的默认值。如果您没有为 NOT NULL 字段指定值,则会引发错误。没有系统默认值。
  • “默认默认值”是什么意思?除非您选择选择一些,否则没有默认值。如果有人这样做INSERT whatever(txCity) values ('hello');,那将适用于版本 1,但不适用于没有默认值的版本。​​
  • 如果您尝试在该表中插入一行而不指定列的值,您将被阻止。如果您没有明确指定一个,则没有自动默认值。
  • @Siyual 对不起,对不起。不知道为什么我认为存在系统默认值。 (其实我知道为什么,太多的 VB.net 毁了我的大脑。)
  • 我想我应该删除这个问题,不是吗?

标签: sql sql-server tsql ddl


【解决方案1】:

例如,您从第一批问题创建表格。然后像这样插入值

INSERT INTO dbo.whatever (flBlahBlah) VALUES (1)

您将获得 1 行 dbo.whatever

flBlahBlah  txCity  cdFrom
1       

因此,如果您“忘记”在已确定默认值的列之一中插入 - SQL Server 将处理它们。

当您获得表格时非常有用,您需要在其中插入新字段。确定默认值后,您无需更改适用于此表的 SP/查询/其他内容。

【讨论】:

  • 谢谢。出于某种原因,我认为在没有默认值的情况下也会发生这种情况。现在我知道得更多了。
  • 我的荣幸!我需要补充一点,如果您为列确定 NULL 或 NOT NULL,它只会告诉服务器该列中是否允许 NULL 值,并且仅在为该列确定且未插入查询时才粘贴默认值。还有''不等于NULL,只表示值为空,NULL表示没有任何值。
猜你喜欢
  • 2018-10-22
  • 2015-12-19
  • 2011-01-08
  • 2011-03-12
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
相关资源
最近更新 更多