Oracle hataları

ORA-00001: unique constraint violated

Tekil kısıt ihlali — aynı anahtar değeri zaten var

ORA-00001: unique constraint (SCHEMA.CONSTRAINT_NAME) violated

Bir INSERT, UPDATE ya da MERGE, birincil anahtar ya da tekil kısıtla korunan bir kolona zaten var olan bir değeri yazmaya çalıştı. Mesajdaki kısıt adını bulun, hangi kolonları kapsadığına bakın; ya değeri değiştirin ya da yeni satır eklemek yerine var olan satırı güncelleyin.

Ne anlama gelir?

Birincil anahtar ya da tekil kısıt (veya tekil indeks), belirli kolonlarda iki satırın aynı değeri taşımamasını garanti eder. Bir ifade kopya oluşturacaksa Oracle o ifadeyi reddeder ve mesajda kısıtın adını verir — örneğin HR.EMP_EMAIL_UK. Aynı işlem (transaction) içinde daha önce yapılan değişiklikler etkilenmez.

Yaygın nedenler

Nasıl çözülür?

  1. Mesajdaki kısıt adını okuyun ve kolonlarını USER_CONS_COLUMNS (ya da sahibiyle birlikte ALL_CONS_COLUMNS) içinde bulun.
  2. Satır zaten var mı bakın; varsa eklemek yerine güncelleyin — MERGE ikisini tek ifadede yapar.
  3. Sequence geride kaldıysa onu mevcut en büyük değerin ötesine taşıyın: Oracle 18c ve sonrasında ALTER SEQUENCE … RESTART START WITH n, eski sürümlerde en büyük değeri geçene kadar artırarak.
  4. Toplu yüklemelerde tüm yüklemeyi düşürmek yerine kopyaları toplamak için DML hata kaydını (LOG ERRORS INTO) kullanın.

Örnek

Kısıtın arkasındaki kolonları bulun:

SELECT column_name, position
  FROM all_cons_columns
 WHERE owner = 'HR'
   AND constraint_name = 'EMP_EMAIL_UK'
 ORDER BY position;

Tek ifadede ekle ya da güncelle:

MERGE INTO employees e
USING (SELECT :email AS email, :name AS name FROM dual) s
   ON (e.email = s.email)
 WHEN MATCHED THEN UPDATE SET e.name = s.name
 WHEN NOT MATCHED THEN INSERT (email, name) VALUES (s.email, s.name);

SQLlightspeed’de

Bir ifade hata verdiğinde SQLlightspeed’in hata paneli, hata kodunu sade bir Türkçe açıklama ve ne yapmanız gerektiğine dair bir öneriyle; Oracle’ın kendi mesajı ve Oracle dokümantasyonuna bağlantıyla birlikte gösterir — bu hata ve sık görülen onlarca başka hata için.

İlgili hatalar

ORA-01400ORA-12899ORA-00054 Tüm Oracle hataları →

Oracle dokümantasyonu: ORA-00001. Oracle, Oracle Corporation’ın tescilli ticari markasıdır. SQLlightspeed’in Oracle ile bir bağlantısı yoktur.