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にアクセスして、データベース固有の知識を入力したくありません。
もっと良い方法があるに違いない。
ALTER TABLE tbl ADD col INTEGER CONSTRAINT tempname DEFAULT 1
最初に、、および明示的に名前が付けられた制約を(おそらくトランザクション内で)後に削除します。
デフォルトで列を追加してからデフォルトを削除するには、デフォルトに名前を付けることができます。
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つのメソッド間で使用されるリソースを比較できませんでした。
別の、おそらくもっとネイティブな方法は次のようになります。
ALTER TABLE tbl ADD COLUMN col INTEGER NOT NULL DEFAULT 1;
ALTER TABLE tbl ALTER COLUMN col DROP DEFAULT;
この関数がどのくらいの期間存在するかはわかりませんが、 PostgreSQLドキュメント はバージョン7.1に戻り、7.1についてはすでに説明されています。
挿入トリガーで実行できます
テーブルの作成時にデフォルトの制約を追加すると、それが何と呼ばれるかがわかりません。ただし、ALTER TABLEを使用して制約を追加する場合は、制約に名前を付ける必要があります。この場合、ALTER TABLE DROP CONSTRAINTを実行できます(これはT-SQLに適用され、他のデータベースについてはわかりません)。
ただし、これには、NULL列を持つCREATE TABLE、制約を追加するためのALTER TABLE、列をNOT NULLにし、最後にDROPCONSTRAINTが必要になります。
あなたの行はすでに追加されているので、挿入トリガーが他の誰かが述べたように機能するとは思わない。
あなたが説明する方法は、実際、最も効率的でエレガントな解決策かもしれないと思います。