28

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

私が思いつくことができる最高のものは次のとおりです。

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 レコード) では少し効率が悪いようです。

デフォルトで列を追加してから、デフォルトの制約を削除して実験しました。ただし、デフォルトの制約の名前が何であるかはわかりません。sysobjects にアクセスせず、データベース固有の知識を入れたくありません。

もっと良い方法があるはずです。

4

5 に答える 5

18

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

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 つの方法で使用されるリソースを比較できませんでした。

于 2009-06-25T05:32:58.660 に答える
17

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

于 2009-06-25T05:10:58.563 に答える
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 については既に説明されています。

于 2019-08-12T10:46:48.003 に答える
1

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

于 2009-06-25T05:10:34.227 に答える
0

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

ただし、これには NULL 列で CREATE TABLE を実行し、ALTER TABLE で制約を追加し、列を NOT NULL にして、最後に DROP CONSTRAINT を実行する必要があります。

行が既に追加されているため、挿入トリガーが他の誰かが言及したように機能するとは思いません。

実際、あなたが説明する方法は、最も効率的でエレガントなソリューションであると思います。

于 2009-06-25T05:15:19.090 に答える