我可以在没有DEFAULT值的情况下添加非空列

时间:2010-10-22 14:47:46

标签: sql sql-server sql-server-2005 tsql

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

  

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

如果是,请告诉我语法,如果不,请说明理由。

10 个答案:

答案 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