既存の列の値と等しいデフォルト値でテーブルに列を追加します


90

既存の列の値と等しいデフォルト値でSQLServerテーブルに列を追加するにはどうすればよいですか?

私はこのT-SQLステートメントを試しました:

ALTER TABLE tablename 
ADD newcolumn type NOT NULL DEFAULT (oldcolumn) 

しかし、それはエラーを与えています:

このコンテキストでは、「oldcolumn」という名前は許可されていません。有効な式は、定数、定数式、および(一部のコンテキストでは)変数です。列名は許可されていません。


6
デフォルト値は、別の列ではなく定数にすることができます。これにはトリガーが必要だと思います。
ypercubeᵀᴹ

1
わかりました、どうすればそれを行うことができますか、私はSQLに不慣れです。
doesdos 2012年

1
これは常にデフォルトになりますか、それとも新しい列がテーブルに追加されている間に既存の行の列にデータを入力するためだけですか?
damien_The_Unbeliever 2012年

1
@Damien_The_Unbelieverは、既存の行の列にデータを入力するためだけのものです。
doesdos 2012年

2
あなたはそれを別のものとしてしなければなりませんUPDATE、私は恐れています。
damien_The_Unbeliever 2012年

回答:


73

これを試して:

ALTER TABLE tablename ADD newcolumn type NOT NULL DEFAULT (0)
Go
Update tablename SET newcolumn = oldcolumn Where newcolumn = 0
Go

5
..はい。ただし、これは既存の行に対してのみ機能します。新しい行が挿入されたときに[newcolumn]値は設定されません。AFTER INSERTトリガーなどが必要です
Milan

14
これにより、テーブルに意図しないデフォルトの制約が追加されます
Romain Vergnory 2015

1
私は既存の列の最初の、そして移入値でNOT NULLに制限なしで行くと、後で再びNOT NULLを追加した方がよい、同意@RomainVergnory
adkl

15

私はそれらがあまり好きではありませんが、AFTER INSERTトリガーを使用してこれを行う方法は次のとおりです。

CREATE TRIGGER TableX_AfterInsert_TRG 
  ON TableX 
AFTER INSERT
AS
  UPDATE TableX AS t
  SET t.newcolumn = t.oldcolumn
  FROM Inserted AS i
  WHERE t.PK = i.PK ;              -- where PK is the PRIMARY KEY of the table   

13

AFTER INSERTトリガアプローチは、オーバーヘッドの余分のために必要とするUPDATE声明。INSTEAD OF INSERT次のように、トリガーを使用することをお勧めします。

CREATE TRIGGER tablename_on_insert ON tablename 
INSTEAD OF INSERT 
AS
INSERT INTO tablename (oldcolumn, newcolumn)
SELECT oldcolumn, ISNULL(newcolumn, oldcolumn)
FROM inserted

ただし、oldcolumnが自動ID列の場合、これは機能しません。


2
INSTEAD OFトリガーはまた、一時的なテーブルを使用している場合は動作しません:SYSTEM_VERSIONING = ON
CalvinDale

3

Kapilの答えを拡張し、不要なデフォルトの制約を回避するには、次のことを試してください。

ALTER TABLE tablename ADD newcolumn type NOT NULL CONSTRAINT DF_TMP_TABLENAME_NEWCOLUMN DEFAULT -9999
Go
Update tablename SET newcolumn = oldcolumn
Go
ALTER TABLE tablename DROP CONSTRAINT DF_TMP_TABLENAME_NEWCOLUMN
Go

タイプがvarchar、nvarchar、datetime、...の場合は、-9999を「noData」に置き換えます。他のタイプと互換性のあるデータに置き換えます。特定の値は関係ありません。2番目の命令で消去されます。


1

計算列を使用して、既存の列の値に基づいてテーブルに新しい列を挿入できます

ALTER TABLE dbo.TableName ADD NewColumn AS (OldColumn) PERSISTED;

または、既存の列の値に基づいて値に変更を加える場合は、

ALTER TABLE dbo.TableName ADD NewColumn AS (OldColumn * 1.5) PERSISTED;

0

私の場合、CODEという名前のnull以外の新しい一意の列を追加したいのですが、作成時の値がわかりません。NewID()からデフォルト値を取得してデフォルト値を設定し、後で更新します。

ALTER TABLE [WIDGET] ADD [CODE] CHAR(5) NOT NULL DEFAULT(SUBSTRING(CONVERT(CHAR(36), NEWID()), 1, 5))

ALTER TABLE [dbo].[WIDGET] WITH CHECK ADD CONSTRAINT [UQ_WIDGET_CODE] UNIQUE ([CODE])

-3

を使用Set Identity_Insert <TableName> OFFし、挿入ステートメントの後に使用するだけで機能すると思いますSet Identity_Insert <TableName> ON

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.