web-dev-qa-db-ja.com

初期値(デフォルトではない)で新しい列を追加する最良の方法は?

MS SQL2005データベースに初期値を使用して新しい列を追加する必要があります。ただし、この列にデフォルトの制約を自動的に作成したくありません。列を追加した時点では、デフォルト/初期値は正しいですが、これは時間の経過とともに変化する可能性があります。したがって、テーブルへの将来のアクセスでは、デフォルトを受け入れる代わりに値を指定する必要があります。

私が思いつくことができる最高のものは:

ALTER TABLE tbl ADD col INTEGER NULL
UPDATE tbl SET col = 1
ALTER TABLE tbl ALTER COLUMN col INTEGER NOT NULL

これは、大きなテーブル(100,000〜1,000,000レコード)には少し非効率のようです。

デフォルトで列を追加してから、デフォルトの制約を削除してみました。ただし、デフォルトの制約の名前がわからないため、sysobjectにアクセスして、データベース固有の知識を入力したくありません。

もっと良い方法があるに違いない。

26
Adrian

ALTER TABLE tbl ADD col INTEGER CONSTRAINT tempname DEFAULT 1最初に、、および明示的に名前が付けられた制約を(おそらくトランザクション内で)後に削除します。

16
Alex Martelli

デフォルトで列を追加してからデフォルトを削除するには、デフォルトに名前を付けることができます。

ALTER TABLE tbl ADD col INTEGER NOT NULL CONSTRAINT tbl_temp_default DEFAULT 1
ALTER TABLE tbl drop constraint tbl_temp_default

これは値1を入力しましたが、デフォルトなしでテーブルを残します。 SQL Server 2008を使用して、これとalter update alterのコードを実行しましたが、100,000行の小さなテーブルで目立った違いは見られませんでした。 SSMSは、alter tableステートメントのクエリプランを表示しないため、2つのメソッド間で使用されるリソースを比較できませんでした。

15

別の、おそらくもっとネイティブな方法は次のようになります。

ALTER TABLE tbl ADD COLUMN col INTEGER NOT NULL DEFAULT 1;
ALTER TABLE tbl ALTER COLUMN col DROP DEFAULT;

この関数がどのくらいの期間存在するかはわかりませんが、 PostgreSQLドキュメント はバージョン7.1に戻り、7.1についてはすでに説明されています。

1
trent

挿入トリガーで実行できます

1
Hans Malherbe

テーブルの作成時にデフォルトの制約を追加すると、それが何と呼ばれるかがわかりません。ただし、ALTER TABLEを使用して制約を追加する場合は、制約に名前を付ける必要があります。この場合、ALTER TABLE DROP CONSTRAINTを実行できます(これはT-SQLに適用され、他のデータベースについてはわかりません)。

ただし、これには、NULL列を持つCREATE TABLE、制約を追加するためのALTER TABLE、列をNOT NULLにし、最後にDROPCONSTRAINTが必要になります。

あなたの行はすでに追加されているので、挿入トリガーが他の誰かが述べたように機能するとは思わない。

あなたが説明する方法は、実際、最も効率的でエレガントな解決策かもしれないと思います。

0
Dave Bauman