私は2列の既存のテーブルを持っています [Employee_Id , Salary]
いくつかのレコードが含まれています。
Employee_Codeという新しい列を追加したい
1 Not Null
2 Unique
テーブルにはすでにいくつかの行があり、列はNULL可能でないため、デフォルト値を追加する必要があります。
一意の制約を追加しているため、デフォルト値を追加しても機能しません。
一意制約を持つ既存のテーブルに非NULL列を追加するにはどうすればよいですか?
回答:
回答№1の場合は3これを行う唯一の方法は、新しい列を一意の制約を持つNULL列として設定し、データが含まれるすべての行の列にデータを入力してから、非NULL列に変更します。
回答№2の場合は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値を使用しなくても、これを行うためのより良い方法を見つけました。上記のコードを更新しました。
回答№3の場合は0
列を作成し、値を入力してから、次のような制約を追加するだけです。
ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL
回答№4の場合は0
- この列をnull許容ではなく、デフォルト値で追加します。たとえば、0とします。
- 0でフィルタリングされた、列に一意のフィルタリングされたインデックスを作成します
このようにして、列の0の値は壊れません一意の制約。新しい行の値を0にしたくない場合は、デフォルトの制約を削除し、CHECK制約<> 0を追加します(オプションNOCHECKを使用すると、古い値は検証されません)。
回答№5の場合は0
以下のクエリを試して、新しい列を追加してください
テーブルの変更従業員の追加Employee_Codeint
答え№6の場合は0
主キー列を作成するには:-
テーブルの変更従業員の主キーの追加(Employee_Code)