繁体   English   中英

我可以添加一个没有 DEFAULT 值的非空列吗

[英]Can I add a not null column without DEFAULT value

我可以添加一个我指定为 NOT NULL 的列,我不想指定 DEFAULT 值,但 MS-SQL 2005 说:

ALTER TABLE 只允许添加可以包含空值的列,或者指定了 DEFAULT 定义,或者添加的列是标识或时间戳列,或者如果前面的条件都不满足,则表必须为空以允许添加本专栏的。 列 'test' 不能添加到非空表 'shiplist' 中,因为它不满足这些条件。

如果是,请告诉我语法,如果不是,请说明原因。

不,你不能。

因为如果可以,SQL 将不知道将什么作为值放入现有记录中。 如果表中没有任何记录,它就可以正常工作。

最简单的方法是使用默认值创建列,然后删除默认值。

ALTER TABLE dbo.MyTable ADD
MyColumn text NOT NULL CONSTRAINT DF_MyTable_MyColumn DEFAULT 'defaultValue'
ALTER TABLE dbo.MyTable
DROP CONSTRAINT DF_MyTable_MyColumn

另一种选择是添加没有约束的列,填充所有单元格的值并添加约束。

将列添加到表中,更新现有行,使它们都不为空,然后添加“非空”约束。

否 - SQL Server 相当合理地拒绝了这一点,因为它不知道现有行应该具有什么值

很容易同时创建一个 DEFAULT,然后立即删除它。

我使用这种方法插入没有默认值的 NOT NULL 列

ALTER TABLE [Table] ADD [Column] INT NULL
GO
UPDATE [Table] SET [Column] = <default_value>
ALTER TABLE [Table] ALTER COLUMN [Column] INT NOT NULL

不,你不能。 但是可以考虑将默认值指定为('')

没有。

只需使用空字符串'' (如果是字符类型)或 0(如果是数字)等作为默认值

不,您不能,因为 SQL Server 或任何其他数据库引擎将强制此新列对于数据表中的现有行为空。 但由于您不允许 NULL,您需要提供默认值以尊重您自己的约束。 这很有道理! DBE 不会为现有行的非空值推断值。

@ Damien_The_Unbeliever 的评论,是不是增加了计算列? 问题和回答都没有暗示任何类似的东西。 在计算列的情况下,错误状态:

“只能在计算列上创建 UNIQUE 或 PRIMARY KEY 约束,而 CHECK、FOREIGN KEY 和 NOT NULL 约束要求计算列被持久化”

好的,如果要继续这个猜谜游戏,这里是我的脚本,说明在一个“ALTER TABLE”步骤中添加“NOT NULL”列:

CREATE TABLE TestInsertComputedColumn 
(
    FirstName VARCHAR(100),
    LastName CHAR(50)
);  

insert into TestInsertComputedColumn(FirstName,LastName)
     select 'v', 'gv8';
select * from TestInsertComputedColumn;

ALTER TABLE TestInsertComputedColumn 
      ADD FullName As FirstName + LastName PERSISTED NOT NULL;

select * from TestInsertComputedColumn;
--drop TABLE TestInsertComputedColumn;

我使用以下方法对我有用

Syntax:
ALTER TABLE <YourTable> ADD <NewColumn> <NewColumnType> NOT NULL DEFAULT <DefaultValue>

Example:
ALTER TABLE Tablename ADD ColumnName datetime NOT NULL DEFAULT GETDATE();

作为一个选项,您可以最初创建 Null-able 列,然后使用有效的非空值更新您的表列,最后使用 ALTER 列设置 NOT NULL 约束:

ALTER TABLE MY_TABLE ADD STAGE INT NULL
GO
UPDATE MY_TABLE SET <a valid not null values for your column>
GO
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL
GO

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM