web-dev-qa-db-ja.com

テーブルを変更して外部キーを追加すると、追加の制約が作成されるのはなぜですか?

編集:列を追加するときにデフォルト値を設定した結果、これはデフォルトの制約でした。名前は、 'DF__'で始まるときにそれを与えました。とにかく、列を追加して手動で制約に名前を付けることで解決しました。

ALTER TABLE MyTable ADD [FooId] [int] NOT NULL CONSTRAINT DF_MyTable_FooId DEFAULT 0

これで、制約を簡単に削除して列を削除できます。


テストの目的で、いくつかのテーブルを頻繁に削除して再作成する必要があります。 MS-Sqlサーバー2008 r2を使用しています。

テーブルを作成するときに、既存のテーブル(ドロップできないテーブル)に外部キーも作成します。

ALTER TABLE MyTable
ADD CONSTRAINT FK_MyTable_NewTable
FOREIGN KEY (FooId) REFERENCES NewTable (Id)

これは外部キーを正しく作成しますが、システム生成名(DF__MyTable_FooId__53385258など)の制約も追加します。これは、CREATE TABLEステートメントで外部キーが定義されている場合は作成されません。

私の問題は、MyTableを削除するときに外部キー制約を削除する必要があることです。これは名前を付けたのでこれは十分簡単ですが、他のシステム生成の制約はまだ存在し、直接削除する方法がありません。それ。

システムが2番目の(そして私が想定している冗長な)制約を生成せずに、外部キーを既存のテーブルに追加することは可能ですか?

5
hvidgaard

あなたのようなDDLステートメントが「追加の」制約をもたらす可能性があると私が考える唯一の方法は、DDLステートメントに応答してその制約を作成するDDLトリガーがある場合です。それがデータベースに当てはまらない場合、上記の追加の制約は、外部キーを作成するステートメントとは関係のないまったく異なるステートメントの結果であることが確実です。

それは以前の段階(テーブルの作成時など)に表示されたか、投稿のスクリプトと同じスクリプトで実行されたステートメントによって追加され、何らかの理由でその事実が登録されなかった可能性がありますその時あなたと。

5
Andriy M