我可以添加一个我指定为NOT NULL的列,我不想指定DEFAULT值,但是MS-SQL 2005说:
ALTER TABLE只允许添加可以包含空值的列,或者指定了DEFAULT定义,或者添加的列是标识或时间戳列,或者如果以前的条件都不满足,则表必须为空允许添加此列。列'test'不能添加到非空表'shiplist'中,因为它不满足这些条件。
如果是,请告诉我语法,如果不,请说明理由。
答案 0 :(得分:77)
因为如果可以的话,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
另一种方法是添加没有约束的列,填充所有单元格的值并添加约束。
答案 1 :(得分:19)
将列添加到表中,更新现有行,使它们都不为null,然后添加“not null”约束。
答案 2 :(得分:8)
否 - SQL Server非常合理地拒绝这一点,因为它不知道现有行应该具有什么值
同时创建DEFAULT很容易,然后立即删除它。
答案 3 :(得分:2)
我使用此方法插入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
答案 4 :(得分:1)
不,你不能。但您可以考虑将默认值指定为(&#39;&#39;)
答案 5 :(得分:0)
没有
只使用空字符串''
(如果是字符类型)或0(如果是数字)等,则使用DEFAULT值
答案 6 :(得分:0)
不,您不能,因为SQL Server或任何其他数据库引擎会强制此新列对于数据表中的现有行为null。但由于您不允许NULL,因此您需要提供默认值以尊重自己的约束。这很有道理! DBE不会为现有行的非空值推断值。
答案 7 :(得分:0)
@ Damien_The_Unbeliever's comment, 是否添加计算列?问题和答案都没有暗示这样的事情。如果是计算列,则错误说明:
“只能在计算列上创建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;
答案 8 :(得分:0)
我使用了以下对我有用的方法
pragma solidity ^0.5.0;
import "./Token.sol";
// rate is 1 token = 0.01 ether
contract Crowdsale {
constructor() public {
rate = 100;
on = true;
}
Token public token;
address payable wallet;
uint256 public rate;
bool on;
event TokenPurchase(address recipient, uint256 numPaid, uint256 numTokensPurchased);
function buyTokens() public payable {
require(msg.value > 0 && on == true);
uint256 tokenAmount = _getTokenAmount(msg.value);
require(token.balanceOf(address(this)) >= tokenAmount);
token.transfer(msg.sender, tokenAmount);
emit TokenPurchase( msg.sender, msg.value, tokenAmount);
}
function () external payable{
buyTokens();
}
答案 9 :(得分:0)
作为一种选择,您可以首先创建可空列,然后使用有效的非空值更新表列,最后使用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