2016-04-20 23 views
2

私は2つのフィールドを持つ1つのテーブルを持っています。構造は次のようになります。PostgreSQLで外部キーと主キー制約を一時的に無効にする方法はありますか?

CREATE TABLE raw_links 
(
    value_id bigint NOT NULL, 
    raw_id integer NOT NULL, 
    CONSTRAINT raw_links_pk PRIMARY KEY (raw_id, dp_id), 
    CONSTRAINT raw_fk FOREIGN KEY (raw_id) 
     REFERENCES raw_data (raw_data_id) MATCH SIMPLE 
     ON UPDATE RESTRICT ON DELETE RESTRICT 
) 

このテーブルから500万レコードを削除する必要があります。そのためには、両方の制約を無効にして、削除を高速化したいと考えています。削除後、私は両方の制約を作成したい。

+0

削除して再作成する必要があります。 –

+0

私は50個のレコードを削除します。その後、再作成すると例外がスローされます。このテーブルとraw_dataテーブルのレコードが一致しない可能性があります。 – SUDARSHAN

答えて

1

ALTER TABLE DROP CONSTRAINT raw_links_pkraw_fkと同じことができます。

レコードを削除した後、テーブルの統計情報を更新するために、最初にVACUUM ANALYZE raw_links(またはディスクスペースを再利用する場合はVACUUM FULL raw_links)を実行します。

最後に、制約をALTER TABLE ADD CONSTRAINT ...で再構築します。

+0

私は私の50のlakhsレコードを削除します。その後、私はそれが例外をスローするでしょうか?再作成すると、このテーブルとraw_dataテーブルの間のレコードの不一致のチャンスがあるので。 – SUDARSHAN

+0

これは、raw_data .raw_data_id'これをやっている間。その場合、制約を削除することはできませんし、制約を適用してゆっくりと実行してください。 – Patrick

関連する問題