Postgresql

如何驗證我在 postgresql 中的所有約束?

  • October 4, 2019

似乎我被 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;
$$;

引用自:https://dba.stackexchange.com/questions/62739