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
- Anahtarı zaten var olan bir satır eklemek — çoğunlukla aynı verinin iki kez yüklenmesi.
- Verinin gerisinde kalmış bir sequence; genellikle import sonrasında ya da elle sabit ID ile yapılan eklemelerden sonra.
- Tekil bir kolonu başka bir satırda zaten bulunan bir değere çeken UPDATE.
- Paralel oturumların aynı doğal anahtarı aynı anda eklemesi.
Nasıl çözülür?
- Mesajdaki kısıt adını okuyun ve kolonlarını
USER_CONS_COLUMNS(ya da sahibiyle birlikteALL_CONS_COLUMNS) içinde bulun. - Satır zaten var mı bakın; varsa eklemek yerine güncelleyin —
MERGEikisini tek ifadede yapar. - 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. - 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.