23001: restrict_violation
PostgreSQLNe demek?
SQL standardındaki restrict_violation kodudur. Önemli: PostgreSQL, ON DELETE/ON UPDATE RESTRICT ya da NO ACTION tanımlı bir foreign key'in ihlalini bu kodla değil, 23503 (foreign_key_violation) koduyla raporlar; bu kodu çekirdek PostgreSQL'de pratikte görmezsiniz.
Neden olur?
Bağlı çocuk kayıtları olan bir üst kayıt silinmeye ya da anahtarı değiştirilmeye çalışıldığında PostgreSQL 23503 döndürür. 23001 genellikle başka bir veritabanından taşınan uygulama kodunda ya da bir eklentinin özel hatasında karşınıza çıkar. RESTRICT, NO ACTION'dan farklı olarak denetimi transaction sonuna erteleyemez ve hemen hata verir.
Nasıl çözülür?
Önce bağlı alt kayıtları silin/güncelleyin ya da başka bir üst kayda taşıyın; ardından üst kaydı işleyin. İş kuralı izin veriyorsa foreign key'i ON DELETE CASCADE ya da SET NULL ile yeniden tanımlamayı değerlendirin. Toplu silmelerde silme sırasını (önce çocuk, sonra ebeveyn) doğru kurgulayın.