我有一个包含2列的现有表格[Employee_Id , Salary]
,其中包含一些记录。
我想添加一个名为Employee_Code的新列
1 Not Null
2 Unique
由于表中已有一些行且列不可为空,我必须为其添加一个默认值。
由于我添加了一个唯一约束,因此添加默认值将不起作用。
如何将具有唯一约束的非空列添加到现有表?
答案 0 :(得分:3)
执行此操作的唯一方法是将新列创建为具有唯一约束的空列,然后为列中包含数据的所有行填充列,然后将其更改为非空列。 / p>
答案 1 :(得分:1)
正如你正确指出的那样,你不能轻易做到这一点。如果需要唯一约束,则需要在应用约束之前使每个值唯一。
另外,值得一提的是,在创建新约束时不能使用WITH NOCHECK,因为唯一约束(就其本质而言)需要唯一索引。如果没有唯一的键值,就不能拥有唯一的索引!
因此,您需要执行以下操作:
这里有一些代码作为例子:
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)
这样,列中的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)