SQL Server不具有唯一约束的空列更新

时间:2013-12-30 09:55:48

标签: sql sql-server database sql-server-2008-r2 sql-server-2012

我有一个包含2列的现有表格[Employee_Id , Salary],其中包含一些记录。

我想添加一个名为Employee_Code的新列

1 Not Null

2 Unique

由于表中已有一些行且列不可为空,我必须为其添加一个默认值。

由于我添加了一个唯一约束,因此添加默认值将不起作用。

如何将具有唯一约束的非空列添加到现有表?

7 个答案:

答案 0 :(得分:3)

执行此操作的唯一方法是将新列创建为具有唯一约束的空列,然后为列中包含数据的所有行填充列,然后将其更改为非空列。 / p>

答案 1 :(得分:1)

正如你正确指出的那样,你不能轻易做到这一点。如果需要唯一约束,则需要在应用约束之前使每个值唯一。

另外,值得一提的是,在创建新约束时不能使用WITH NOCHECK,因为唯一约束(就其本质而言)需要唯一索引。如果没有唯一的键值,就不能拥有唯一的索引!

因此,您需要执行以下操作:

  • 创建新表
  • 填充它
  • 添加一个带有默认约束的新NOT NULL列(必要时可以在以后删除)
  • 将所有新列值修改为唯一(尽管此代码不保证生成的标识符将是唯一的,并且完全取决于您的数据类型和要求)
  • 应用唯一约束

这里有一些代码作为例子:

IF OBJECT_ID('MyTable') IS NOT NULL
    DROP TABLE MyTable
GO

CREATE TABLE MyTable (
    Id INT IDENTITY PRIMARY KEY,
    Employee_Id INT NOT NULL
)

INSERT INTO MyTable(Employee_Id)
VALUES(1)
INSERT INTO MyTable(Employee_Id)
VALUES(15)
INSERT INTO MyTable(Employee_Id)
VALUES(156)
INSERT INTO MyTable(Employee_Id)
VALUES(3)
INSERT INTO MyTable(Employee_Id)
VALUES(4)
INSERT INTO MyTable(Employee_Id)
VALUES(13)
INSERT INTO MyTable(Employee_Id)
VALUES(16)
INSERT INTO MyTable(Employee_Id)
VALUES(21)

ALTER TABLE MyTable
    ADD Employee_Code VARCHAR(10)
GO

-- TODO: Update your new columns to be unique 
-- Manually or programmatically. Note that I would not recommend 
-- using the below code - it's just for example purposes
UPDATE MyTable
    SET Employee_Code = LEFT(CONVERT(VARCHAR(36), NEWID()), 10)
GO

-- Create the null constraint
ALTER TABLE MyTable
    ALTER COLUMN Employee_Code VARCHAR(10) NOT NULL
GO

-- Create the Unique constraint / index
ALTER TABLE MyTable
    ADD CONSTRAINT MyTable_Employee_Code_Unique UNIQUE(Employee_Code)
GO

<强>更新

实际上,我甚至没有使用DEFAULT值就找到了更好的方法。更新了以上代码。

答案 2 :(得分:0)

您只需简单地创建列,然后填充值,然后像这样添加约束

   ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL

答案 3 :(得分:0)

  1. 将此列添加为不可为空且使用默认值,假设为0。
  2. 在列上创建唯一的过滤索引,过滤器为0
  3. 这样,列中的0值不会破坏唯一约束。如果您不希望任何新行具有0值,请删除默认约束,并添加CHECK约束&lt;&gt; 0(使用选项NOCHECK,因此它不会验证旧值)。

答案 4 :(得分:0)

请尝试以下查询添加新列

Alter table Employee add  Employee_Code int

答案 5 :(得分:0)

制作主键列: -

Alter table Employee  add primary key(Employee_Code)

答案 6 :(得分:0)

如果身份不成问题,则可以将IDENTITY列添加到表中。

ALTER TABLE表名 添加列名INT IDENTITY(1、1)

示例:

ALTER TABLE员工 添加empCode INT非空IDENTITY(1,1)