簡體   English   中英

具有唯一約束的 SQL Server 非空列更新

[英]SQL Server not null column update with unique constraint

我有一個現有的表,其中有 2 列說[Employee_Id , Salary] ,其中有幾條記錄。

我想添加一個新列,說 Employee_Code 這是

1 Not Null

2 Unique

由於表中已經有一些行並且該列不可為空,因此我必須為其添加一個默認值。

由於我正在添加唯一約束,因此添加默認值將不起作用。

如何向具有唯一約束的現有表添加非空列?

執行此操作的唯一方法是將新列創建為具有唯一約束的空列,然后為其中包含數據的所有行填充該列,然后將其更改為非空列。

正如您正確指出的那樣,您不能輕松做到這一點。 如果您需要唯一約束,則需要在應用約束之前使每個值唯一。

此外,值得一提的是,在創建新約束時不能使用 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 值。 更新了上面的代碼。

您只需簡單地創建列並填充值然后添加這樣的約束

   ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL
  1. 將此列添加為不可為空並使用默認值,假設為 0。
  2. 在列上創建唯一的過濾索引,過濾為 0

這樣列中的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM