merhaba;
içi dolu olan database dosyasındaki kayıtları boş olan database dosyasına aktarımını yaparken aşağıdaki hata mesajını alıyorum. hatayı aşmak için ne yapabilirim.
hata mesajı;
violation of PRİMARY or UNIQUE KEY constraint "PK_TBLCARIKAYIT" on table "TBLCARIKAYIT"'
aktarımda iki database için IBDATASET kullanıyorum aktarılan dataset te generator ile her yeni kayıt eklemesinde ID alanını 1 arttırıyorum.
teşekkür ederim.
iki DataBase arasında veri aktarımında hata
-
- Üye
- Mesajlar: 386
- Kayıt: 02 Tem 2007 09:43
iki DataBase arasında veri aktarımında hata
İsteyen, yapabildiğinden daha fazlasını yapar.
Re: iki DataBase arasında veri aktarımında hata
Hata mesajı : violation of PRİMARY or UNIQUE KEY constraint "PK_TBLCARIKAYIT" on table "TBLCARIKAYIT"'
Hata mesajı, TBLCARIKAYIT tablosu üzerinde PK_TBLCARIKAYIT adlı birincil (primary) ya da eşsiz (unique) anahtarın ihlal edildiği anlamına geliyor. Yani hedef veritabanındaki TBLCARIKAYIT adlı tabloya insert (ya da update ile de mümkün) yapmaya çalışıyorsunuz ve veri, PK_TBLCARIKAYIT 'ı ihlal ediyor.
Bir primary key veya unique key, veri tekrarlılığını önlemeye yarar. Örneğin, tc_kimlik_no, ad, soyad adlı üç alandan oluşan bir tabloya ihtiyacım olsaydı, tc_kimlik_no alanını primary key olarak işaretlerdim. Çünki, biliyoruz (veya umuyoruz) ki birden fazla kişiye aynı tc kimlik numarası verilmiyor. Böylece, yanlışlıkla (mesela yoğun bir iş günü bir A4 üzerindeki listeden bakarak programa kayıt girerken) aynı tc kimlik nonun iki kez kullanılmasını kolayca önlerdik.
Eğer tablomda kayit_id adlı bir alanım daha varsa ve primary key olarak onu seçtiysem; tc_kimlik_no alanını unique olarak işaretleyerek hala veri bütünlüğümü koruyabilirim.
Key constraint ler böyle çalışır ancak tek bir alana verilebileceği gibi birden çok alana da verilebilir. Örneğin, tc kimlik no olmayan yıllar için şöyle bir tablo yapabilirdik : adi, soyadi, baba_adi, anne_adi. Bu durumda, constraint pk_tablo_adi primary key (adi, soyadi, baba_adi, anne_adi); diyebilirdik. Yani diyoruz ki, kişilerin adları ve soyadları birbirine benzeyebilir veya farklı ad soyada sahip kişiler aynı anne veya baba adına sahip olabilirler, vs. Ancak iki farklı kişinin adı, soyadı, anne adı ve baba adı aynı olamaz.
Probleminize dönersek,
İşi kolayca çözmek için, hedef veritabanınızda, hata veren key constraint i SİLMEYİN ! Eğer bunu yaparsanız, veri aktarımnını geçersiniz hatta belki programınız da çalışır ancak ileride, nedenini bulması hatta varlığını keşfetmesi zor başka hatalara neden olursunuz.
Hedef veritabanındaki key constraint leri inceleyin. Aynı key constraint leri kaynak veritabanında oluşturmaya çalışın. Bunu yapmaya çalışırken, hem kaynak veritabanını uygun hale getirmiş olursunuz; hem de üzerinde çalıştığınız programın ve veritabanının mantığına daha iyi hakim olursunuz.
Son olarak, kaynak veritabanındaki mükerrer kayıtları şu tür sorgular ile bulabilirsiniz:
İlk tablo örneğimiz için sorgu;
ya da
İkinci tablo örneğimizde tüm alanları constraint e dahil ettiğimiz için group by anlamsız oluyor, basitçe sıralatmamız yeterli
Hata mesajı, TBLCARIKAYIT tablosu üzerinde PK_TBLCARIKAYIT adlı birincil (primary) ya da eşsiz (unique) anahtarın ihlal edildiği anlamına geliyor. Yani hedef veritabanındaki TBLCARIKAYIT adlı tabloya insert (ya da update ile de mümkün) yapmaya çalışıyorsunuz ve veri, PK_TBLCARIKAYIT 'ı ihlal ediyor.
Bir primary key veya unique key, veri tekrarlılığını önlemeye yarar. Örneğin, tc_kimlik_no, ad, soyad adlı üç alandan oluşan bir tabloya ihtiyacım olsaydı, tc_kimlik_no alanını primary key olarak işaretlerdim. Çünki, biliyoruz (veya umuyoruz) ki birden fazla kişiye aynı tc kimlik numarası verilmiyor. Böylece, yanlışlıkla (mesela yoğun bir iş günü bir A4 üzerindeki listeden bakarak programa kayıt girerken) aynı tc kimlik nonun iki kez kullanılmasını kolayca önlerdik.
Eğer tablomda kayit_id adlı bir alanım daha varsa ve primary key olarak onu seçtiysem; tc_kimlik_no alanını unique olarak işaretleyerek hala veri bütünlüğümü koruyabilirim.
Key constraint ler böyle çalışır ancak tek bir alana verilebileceği gibi birden çok alana da verilebilir. Örneğin, tc kimlik no olmayan yıllar için şöyle bir tablo yapabilirdik : adi, soyadi, baba_adi, anne_adi. Bu durumda, constraint pk_tablo_adi primary key (adi, soyadi, baba_adi, anne_adi); diyebilirdik. Yani diyoruz ki, kişilerin adları ve soyadları birbirine benzeyebilir veya farklı ad soyada sahip kişiler aynı anne veya baba adına sahip olabilirler, vs. Ancak iki farklı kişinin adı, soyadı, anne adı ve baba adı aynı olamaz.
Probleminize dönersek,
İşi kolayca çözmek için, hedef veritabanınızda, hata veren key constraint i SİLMEYİN ! Eğer bunu yaparsanız, veri aktarımnını geçersiniz hatta belki programınız da çalışır ancak ileride, nedenini bulması hatta varlığını keşfetmesi zor başka hatalara neden olursunuz.
Hedef veritabanındaki key constraint leri inceleyin. Aynı key constraint leri kaynak veritabanında oluşturmaya çalışın. Bunu yapmaya çalışırken, hem kaynak veritabanını uygun hale getirmiş olursunuz; hem de üzerinde çalıştığınız programın ve veritabanının mantığına daha iyi hakim olursunuz.
Son olarak, kaynak veritabanındaki mükerrer kayıtları şu tür sorgular ile bulabilirsiniz:
İlk tablo örneğimiz için sorgu;
Kod: Tümünü seç
select
tc_kimlik_no, adi, soyadi
from tablo_adi
group by tc_kimlik_no
Kod: Tümünü seç
select
tc_kimlik_no, count(adi)
from tablo_adi
Kod: Tümünü seç
select
*
from tablo_adi
order by adi, soyadi, anne_adi, baba_adi
Ömür Ölmez
-
- Üye
- Mesajlar: 386
- Kayıt: 02 Tem 2007 09:43
Re: iki DataBase arasında veri aktarımında hata
değerli kardeşim;
öncelikle şunu belirtmeliyim ki 3 satırlık soruya 30 satırlık cevap yazma zahmetinde bulunman ne kadar erdemli bir insan olduğunu gösteriyor. bunun için sizi tebrik ediyorum.
soruyu sorduktan sonra kodu incelerken cari kayıt tablosuna stok tablosundaki kaydı aktarmaya çalışıyormuşum. muhtemelen sorun burdan kaynaklanıyormuş. söylediğiniz gibi primary alanda aynı verinin tekrarı gibi bir durum oluşuyor.
teşekkür ederim
öncelikle şunu belirtmeliyim ki 3 satırlık soruya 30 satırlık cevap yazma zahmetinde bulunman ne kadar erdemli bir insan olduğunu gösteriyor. bunun için sizi tebrik ediyorum.
soruyu sorduktan sonra kodu incelerken cari kayıt tablosuna stok tablosundaki kaydı aktarmaya çalışıyormuşum. muhtemelen sorun burdan kaynaklanıyormuş. söylediğiniz gibi primary alanda aynı verinin tekrarı gibi bir durum oluşuyor.
teşekkür ederim
İsteyen, yapabildiğinden daha fazlasını yapar.
Re: iki DataBase arasında veri aktarımında hata
@omurolmez@akuyumcu63 yazdı:değerli kardeşim;
öncelikle şunu belirtmeliyim ki 3 satırlık soruya 30 satırlık cevap yazma zahmetinde bulunman ne kadar erdemli bir insan olduğunu gösteriyor. bunun için sizi tebrik ediyorum.
Teşekkürler.

Re: iki DataBase arasında veri aktarımında hata
Estağfurullah, o erdem size ait. Forum çok değerli arkadaşlarla dolu, ben sadece onları örnek almaya çalışıyorum.
Ömür Ölmez