/ /一意制約を使用したSQL ServerのNULLでない列の更新-sql、sql-server、database、sql-server-2008-r2、sql-server-2012

一意の制約を持つSQL Server not null列の更新 - sql、sql-server、database、sql-server-2008-r2、sql-server-2012

私は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
  1. この列をnull許容ではなく、デフォルト値で追加します。たとえば、0とします。
  2. 0でフィルタリングされた、列に一意のフィルタリングされたインデックスを作成します

このようにして、列の0の値は壊れません一意の制約。新しい行の値を0にしたくない場合は、デフォルトの制約を削除し、CHECK制約<> 0を追加します(オプションNOCHECKを使用すると、古い値は検証されません)。


回答№5の場合は0

以下のクエリを試して、新しい列を追加してください

テーブルの変更従業員の追加Employee_Codeint


答え№6の場合は0

主キー列を作成するには:-

テーブルの変更従業員の主キーの追加(Employee_Code)