40002: transaction_integrity_constraint_violation
PostgreSQLNe demek?
SQL standardında, transaction sonunda denetlenen bir bütünlük constraint'inin COMMIT anında ihlal edilmesini ifade eden koddur. Önemli: PostgreSQL bu kodu pratikte üretmez; ertelenmiş (DEFERRED) constraint ihlallerini COMMIT'te constraint'in kendi koduyla döndürür: foreign key için 23503, benzersizlik için 23505.
Neden olur?
DEFERRABLE INITIALLY DEFERRED tanımlı bir foreign key ya da benzersizlik constraint'i, transaction içindeki ara adımlarda geçici olarak bozuldu ve COMMIT anına kadar düzeltilmedi; PostgreSQL'de bu durum 23503/23505 olarak raporlanır. Örneğin karşılıklı referanslı satırların yanlış sırayla eklenip düzeltilmemesi bu durumu doğurur.
Nasıl çözülür?
Transaction mantığını, COMMIT'ten önce tüm ertelenmiş constraint'lerin sağlanacağı şekilde düzeltin (eksik referansları ekleyin, çakışmaları giderin). Gerekirse SET CONSTRAINTS ... IMMEDIATE ile constraint'i transaction içinde erken denetleyerek sorunlu adımı erkenden yakalayın. Karşılıklı referanslarda ekleme/güncelleme sırasını yeniden düzenleyin.