Postgresql
如何驗證我在 postgresql 中的所有約束?
似乎我被 postgresql 9.3.4 的發行說明中描述的第一個錯誤所困擾:http ://www.postgresql.org/docs/devel/static/release-9-3-4.html
我現在有例如重複的主鍵。循環重新檢查我的所有約束(pkeys、fkeys)-> 修復問題-> 再次檢查以確保我的數據正常的最佳方法是什麼?
更新
我決定通過刪除所有約束來解決問題,然後使用以下方法重新創建它們http://blog.hagander.net/archives/131-Automatically-dropping-and-creating-constraints.html。但是我目前遇到一條錯誤消息,試圖重新創建一個 pkey:
ERROR: failed to find parent tuple for heap-only tuple at (1192248,5) in table "fruits" CONTEXT: SQL statement "ALTER TABLE "pm"."fruits" ADD CONSTRAINT "fruits_pkey" PRIMARY KEY (id)"
這是什麼意思,我該如何解決這個問題(如果可以的話,我可以刪除它)?
另一個問題:如果我只是通過刪除任何重複的行來刪除它們,然後執行 pg_dump,並從該轉儲中恢復數據庫,我的數據是否真的很好。它會重建資料結構——對吧?
好吧,如果您需要一種方法來檢查表中的所有外鍵是否有效,這可能會有所幫助(它只是驗證架構中的所有外鍵)
do $$ declare r record; BEGIN FOR r IN ( SELECT FORMAT( 'ALTER TABLE %I VALIDATE CONSTRAINT %I;', tc.table_name, tc.constraint_name ) AS x FROM information_schema.table_constraints AS tc JOIN information_schema.tables t ON t.table_name = tc.table_name and t.table_type = 'BASE TABLE' JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name WHERE constraint_type = 'FOREIGN KEY' AND tc.constraint_schema = 'public' ) LOOP EXECUTE (r.x); END LOOP; END; $$;