[英]SQL Server not null column update with unique constraint
我有一個現有的表,其中有 2 列說[Employee_Id , Salary]
,其中有幾條記錄。
我想添加一個新列,說 Employee_Code 這是
1 Not Null
2 Unique
由於表中已經有一些行並且該列不可為空,因此我必須為其添加一個默認值。
由於我正在添加唯一約束,因此添加默認值將不起作用。
如何向具有唯一約束的現有表添加非空列?
執行此操作的唯一方法是將新列創建為具有唯一約束的空列,然后為其中包含數據的所有行填充該列,然后將其更改為非空列。
正如您正確指出的那樣,您不能輕松做到這一點。 如果您需要唯一約束,則需要在應用約束之前使每個值唯一。
此外,值得一提的是,在創建新約束時不能使用 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 值。 更新了上面的代碼。
您只需簡單地創建列並填充值然后添加這樣的約束
ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL
這樣列中的 0 值不會破壞唯一約束。 如果您不希望任何新行具有 0 值,請刪除默認約束,並添加 CHECK 約束 <> 0(使用選項 NOCHECK,因此不會驗證舊值)。
請嘗試以下查詢以添加新列
Alter table Employee add Employee_Code int
制作主鍵列:-
Alter table Employee add primary key(Employee_Code)
如果身份不是您的問題,您可以將 IDENTITY 列添加到表中。
ALTER TABLE 表名 ADD 列名 INT IDENTITY(1, 1)
示例:
ALTER TABLE Employee ADD empCode INT NOT NULL IDENTITY(1, 1)
你不能同時添加兩個約束 NOT NULL , UNIQUE 我猜......
所以為了克服這個問題,我們需要用 NULL 和 UNIQUE 約束來初始化列。
然后用隨機的 'UNIQUE' 值'填充'它,然后你可以使用 constarint NOT NULL
ALTER TABLE <table_name> ADD <column_name> <datatype>;
默認情況下,NULL 值被添加到列中
添加唯一約束
ALTER TABLE <table_name> ADD CONSTRAINT name UNIQUE(<column_name>);
填充隨機唯一值,然后
添加 NOT NULL 約束
ALTER TABLE <table_name> MODIFY <column_name> <datatype> NOT NULL;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.