1

私は非常に大きなデータベース(PostgreSQLで実行)を持っており、それらの間に高度な関係(外部キー、削除カスケードなど)を持つ多くのテーブルが含まれています。いくつかのテーブルからいくつかのデータを削除する必要がありますが、カスケード削除のためにデータベースから実際に削除されるデータの量がわかりません。

削除してはいけないデータを削除しないことを確認するにはどうすればよいですか?

私はテストデータベースを持っています-私がやりたいことができる本物のデータベースのコピーです:)

私が持っている唯一のアイデアは、前後にデータベースをダンプしてチェックすることです。しかし、それは快適に見えません。別のアイデア-データベースの一部をダンプします。これは、私が思うに、DELETEステートメントの影響を受けないようにし、データの削除の前後にこの部分を確認する必要があります。しかし、それを行う簡単な方法はわかりません(数百のテーブルがあり、そのうちの10までで削除が機能するはずです)。それを行う方法はありますか?

問題を解決する方法の他のアイデアはありますか?

4

4 に答える 4

1

information_schemaにクエリを実行して、データベースで制約がどのように定義されているかを把握できます。そうすれば、削除するとどうなるかがわかります。これは、この場合だけでなく、常に役立ちます。

(制約用)のようなもの

select table_catalog,table_schema,table_name,column_name,rc.* from
information_schema.constraint_column_usage ccu, 
information_schema.referential_constraints rc 
where ccu.constraint_name = rc.constraint_name
于 2008-09-25T08:23:43.453 に答える
1

psql を使用して、トランザクションを開始し、削除を実行してから、考えられるチェック クエリを実行します。その後、ロールバックまたはコミットできます。

于 2008-09-25T11:58:41.847 に答える
0

答えてくれてありがとう!

ヴィンコ、あなたの答えは私にとって非常に役に立ちます、そして私はそれをディッパーで研究します。

実際、私の場合は、レコードの削除前後のテーブル数を比較し、どのテーブルが影響を受けたかを確認するだけで十分でした。

これは、以下に説明する簡単なコマンドによって実行されました

psql -U U_NAME -h`hostname` -c '\d' | awk '{print $3}' > tables.list

for i in `cat tables.list `; do echo -n "$i: " >> tables.counts; psql -U U_NAME -h`hostname` -t -c "select count(*) from $i" >> tables.counts; done

for i in `cat tables.list `; do echo -n "$i: " >> tables.counts2; psql -U U_NAME -h`hostname` -t -c "select count(*) from $i" >> tables.counts2; done

diff tables.counts tables.counts2
于 2008-09-25T08:57:05.900 に答える
0

キーがぶら下がっている(つまり、削除されたレコードを指している)ことが心配な場合は、テストデータベースで削除を実行し、クエリを使用して、無効なターゲットを指しているキーを見つけます。(これを行っている間、影響を受けないはずの部分が変更されていないことを確認することもできます)

より良い解決策は、削除カスケードのマッピングに時間を費やして、何を期待できるかを理解することです。データベースがどのように機能するかを知ることは非常に価値があるため、これに費やした労力は、この特定の削除を超えて役立ちます。

そして、大きな変更を行う前にDBをバックアップしていることを確認しても!

于 2008-09-25T08:15:35.393 に答える