在现有表中插入一个非空列。
在给现有表添加一个非空列时,需提供默认值以填充现有的行。可以通过以下SQL语句来实现:
ALTER TABLE dbo.YourTbl ADD newcol int NOT NULL CONSTRAINT DF_YourTbl_newcol DEFAULT 0
从2012年开始,在企业版中,这只是一个元数据的修改。
还有一种解决方法是先将列添加为可空列,然后使用更新语句更新表中的每一行,最后将列修改为非空列。这样做的好处是避免了使用默认约束,因为默认约束可能不是我们想要的。
但是这种方法可能会比较慢,特别是当使用默认值的方式作为元数据修改时(即在企业版或Azure SQL数据库中使用运行时常量值的默认值)。首先,更新语句需要更新所有行,然后将列修改为非空列,这可能会导致大量的日志文件增长。
实际上,如果要运行"ALTER TABLE ADD column NOT NULL"语句并且表中存在行,则需要提供一个默认值。虽然这个默认值只是临时的,但在运行此语句时是必需的。
总结起来,给现有表添加一个非空列时,需要提供默认值以填充现有的行。另一种解决方法是先将列添加为可空列,然后使用更新语句更新每一行,最后将列修改为非空列。但是使用默认值的方式可能更加高效。
在现有的表中插入一个NOT NULL列的原因可能是为了增加数据的完整性和一致性。在某些情况下,我们希望确保某个列中的数据不为空,这样可以避免数据的不完整或不一致。
要解决这个问题,我们可以采用以下两种方法之一。
第一种方法是先创建一个可为空(NULL)的列,然后使用有效的非空值更新该列,最后使用ALTER COLUMN命令设置NOT NULL约束。
ALTER TABLE MY_TABLE ADD STAGE INT NULL; UPDATE MY_TABLE SET ; ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL;
第二种方法是为该列指定正确的默认值。
ALTER TABLE MY_TABLE ADD STAGE INT NOT NULL DEFAULT '0';
需要注意的是,上述答案中包含了GO关键字,这只在Microsoft SQL Server上运行代码时才需要使用。如果您希望在Oracle或MySQL上执行相同的操作,则需要使用分号(;)代替GO。例如:
ALTER TABLE MY_TABLE ADD STAGE INT NULL; UPDATE MY_TABLE SET ; ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL;
评论中还提到了一些关于这两种方法的讨论。有人认为第一种方法更危险,因为如果在更新语句中不小心插入了错误的列,可能会导致数据损坏。另一些人则认为第二种方法更危险,因为添加默认值可能会导致意外插入没有指定新列的行。
总结起来,根据实际情况选择适合的方法来插入NOT NULL列,并注意在不同的数据库管理系统中使用适当的语法。