60

外部キーを使用してテーブルを切り捨てようとしたところ、次のメッセージが表示されました。

FOREIGN KEY 制約によって参照されているため、テーブルを切り捨てることはできません」。

この問題に関する多くの文献を読み、削除を使用して解決策を見つけたと思いました

DELETE FROM table_name DBCC CHECKIDENT (table_name, RESEED, 0)

しかし、私はまだエラーメッセージを受け取りました:

" DELETE ステートメントが REFERENCE 制約と矛盾しています"。

Microsoft Management Studio で削除しようとして、前のクエリを実行すると

DELETE FROM table_name DBCC CHECKIDENT (table_name, RESEED, 0)

エラーは発生せず、正常に動作します。テーブルからすべての情報を削除して新しい情報を追加したいのですが、外部キーを削除して作成したくありません。

4

4 に答える 4

50

このエラーは、削除しようとしているデータを参照する他のテーブルにデータがあることを意味します。

制約を削除して再作成するか、外部キーが参照するデータを削除する必要があります。

次のテーブルがあるとします

dbo.Students
(
StudentId
StudentName
StudentTypeId
)


dbo.StudentTypes
(
StudentTypeId
StudentType
)

StudentTypeIdの列StudentTypesと のStudentTypeId列の間に外部キー制約が存在するとします。Students

すべてのデータを削除しようとすると、テーブル内のデータを参照している列StudentTypesとしてエラーが発生します。StudentTypeIdStudentsStudentTypes

編集:

DELETEそしてTRUNCATE本質的に同じことをします。唯一の違いはTRUNCATE、変更をログ ファイルに保存しないことです。WHEREまた、句を使用することはできませんTRUNCATE

これをSSMSで実行できるが、アプリケーション経由では実行できない理由について。私は本当にこれが起こっているのを見ることができません。FK 制約は、トランザクションがどこから発生したかに関係なく、引き続きエラーをスローします。

于 2010-09-23T07:50:46.883 に答える
14

関連する場合に適用することを検討しON DELETE CASCADEましたか?

于 2010-09-23T09:56:26.837 に答える
9

別の行 (おそらく別のテーブル内) によって参照されている行を削除しようとしています。

最初にその行を削除する必要があります(または、少なくともその外部キーを別のものに再設定する必要があります)。そうしないと、存在しない行を参照する行になってしまいます。データベースはそれを禁止しています。

于 2010-09-23T07:46:24.880 に答える
2

参照を変更せずに DELETE するには、最初に、他のテーブル内の関連するすべての行を (目的に適した方法で) 削除または変更する必要があります。

TRUNCATE するには、参照を削除する必要があります。TRUNCATE は、DML ステートメント (INSERT や DELETE など) ではなく、DDL ステートメント (CREATE や DROP に相当) であり、明示的であるか、参照やその他の制約に関連付けられているかを問わず、トリガーを起動しません。このため、TRUNCATE が参照を持つテーブルで許可されている場合、データベースが不整合な状態になる可能性がありました。これは、TRUNCATE が一部のシステムで使用される標準の拡張機能であったときの規則であり、標準が追加されたため、標準によって義務付けられています。

于 2010-09-23T09:51:01.843 に答える