iki DataBase arasında veri aktarımında hata

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
akuyumcu63
Üye
Mesajlar: 386
Kayıt: 02 Tem 2007 09:43

iki DataBase arasında veri aktarımında hata

Mesaj gönderen akuyumcu63 »

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.
İsteyen, yapabildiğinden daha fazlasını yapar.
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: iki DataBase arasında veri aktarımında hata

Mesaj gönderen omurolmez »

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;

Kod: Tümünü seç

select
  tc_kimlik_no, adi, soyadi
from tablo_adi
group by tc_kimlik_no
ya da

Kod: Tümünü seç

select
  tc_kimlik_no, count(adi)
from tablo_adi
İ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

Kod: Tümünü seç

select
*
from tablo_adi
order by adi, soyadi, anne_adi, baba_adi
Ömür Ölmez
akuyumcu63
Üye
Mesajlar: 386
Kayıt: 02 Tem 2007 09:43

Re: iki DataBase arasında veri aktarımında hata

Mesaj gönderen akuyumcu63 »

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
İsteyen, yapabildiğinden daha fazlasını yapar.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: iki DataBase arasında veri aktarımında hata

Mesaj gönderen mrmarman »

@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.
@omurolmez

Teşekkürler. :bravo:
Resim
Resim ....Resim
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: iki DataBase arasında veri aktarımında hata

Mesaj gönderen omurolmez »

Estağfurullah, o erdem size ait. Forum çok değerli arkadaşlarla dolu, ben sadece onları örnek almaya çalışıyorum.
Ömür Ölmez
Cevapla