insert komutunda foreign key bir alana boş değer girmeliyim

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

insert komutunda foreign key bir alana boş değer girmeliyim

Mesaj gönderen akdatilla »

merhaba
aşağıdaki kod ile oluşturulmuş bir foreign key alanım var

Kod: Tümünü seç

ALTER TABLE SFISA  WITH NOCHECK ADD  CONSTRAINT SFISA_HSK FOREIGN KEY(SFA_HSK)
REFERENCES HESAPKART (HSK_KOD)
tablodaki bu alana bazı durumlarda "" değerini girmem gerekli (NOT NULL)
HESAPKART tablosunda "" kodlu bir kayıt yok.
SFISA tablosuna SFA_HSK alanı "" olan bir kayıt eklemek istediğimde:

Kod: Tümünü seç

Msg 547, Level 16, State 0, Procedure SFAKAYDET, Line 203
The INSERT statement conflicted with the FOREIGN KEY constraint "SFISA_HSK". The conflict occurred in database "DTEK2007", table "dbo.HESAPKART", column 'HSK_KOD'.
The statement has been terminated.
şeklinde bir hata mesajı alıyorum.
Sorunu nasıl çözebilirim? Yardımcı olursanız sevinirim.
Kolay gelsin
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
foreign keylerde veri bütünlüğü açısından böyle birşey mümkün değil.
ben bu gibi durumlar için -1 veya 0 id li bir kayıt açıyorum. fk leri bu kayda yönlendiriyorum.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Mesaj gönderen bgoktas »

NOT NULL bir alana '' girmek isteniyorsa tasarımla ilgili bir sıkıntı olduğu anlamına gelir. Bana göre Foreign Key alanı nullable yapıp null vermek en mantıklısı.

Kolay Gelsin.
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

Mesaj gönderen akdatilla »

Aslında istediğim şeyin matık dışı bir olay olduğunu sanmıyorum.
Bir tane stok hareketleri başlık bilgilerini tutan tablo var.
Bu tabloda bir çok kayıt fatura hareketlerini tutuyor ve bu fatura hareketlerinin hesap kartlarını tutan başka bir tabloyla bağlantısı var.
Ancak bazı stok hareketleri hesaplarla bağlantılı değil.
Örnek olarak bir transfer fişinde 2 depo arasında stok hareketi var.
Bu stok hareketi için fatura kesilmiyor.
İstediğim şey foreign bağlantısında istisnai bir duruma izin verilmesi.
Foreign tanımlamasında istisna belirlenebiliyor mu acaba diye araştırdım.
Ancak doğrusu ben de bulamadım.
Yalnız bgoktaş arkadaşın söylediği null kayıt ekleme olayı başarılı oluyor.
Ben null kayıtları kullanmaktan hep kaçmışımdır aslında. Ancak başka bir çözüm gözükmüyor şu halde (foreign keyi iptal etmek dışında).
Kullanıcı avatarı
ahmet_sinav
Üye
Mesajlar: 263
Kayıt: 17 Nis 2004 07:44
Konum: İzmir Yeşilyurt Ulu Cami
İletişim:

Mesaj gönderen ahmet_sinav »

istisnai durumda foreignkey disable edilebilir daha sonra enable edilir. MSSQL dökümanlarında disable foreign key olarak bakabilirsiniz..
Sayglar;
İmam Süleyman Yakub <==> Molla Mustafa Mansur
Ali Erdoğan
Kıdemli Üye
Mesajlar: 1026
Kayıt: 11 Şub 2005 02:12
Konum: İstanbul

Mesaj gönderen Ali Erdoğan »

En mantıklısı -1 gibi bir değer kullanmak. Ancak ilişkisel olarak -1 numaralı bir fatura bulunmadığı için hata alabilirsin. Bunun da gözardı ettirmen gerekiyor.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a
-1 id li bir fatura tanımla.
bu faturayı kullanıcılar vs. görmesinler. (select işlemlerinde, filitrelemelerinde bunuda eklemen lazım yani.) hareketlerin faturaid sine bu değeri ata.
yalnız depolar arasındaki stok hareketi için fatura olmaz ama irsaliye olması lazım. bu hareketleri bi irsaliye tablosuna ilişkilendirmen lazım. ki hareket tarihleri aynı anda hangi malzemeler hareket etmiş vs. bilgilere ilerde ulaşmak isteyebilrsin.
kolay gelsn.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

Mesaj gönderen akdatilla »

a.s.
Arkadaşlar konu biraz dağıldı sanırım.
ahmet_sinav arkadaş:

Kod: Tümünü seç

istisnai durumda foreignkey disable edilebilir daha sonra enable edilir. MSSQL dökümanlarında disable foreign key olarak bakabilirsiniz.. 
demiş
Sanırım ben istisna kelimesini yanlış kullandım. Faturasıs stok hareketlerinin sayısı faturalı stok hareketlerinden fazla bile olabilir.

Benim foreign key kullanmak istememin iki sebebi vardı:
1- İki tablo arasında bir ilişkinin var olduğunu veritabanı sisteminin bilmesini ve ona göre kendini hazırlamasını istiyordum.
2-Veri tabanının hatalı kayıtlara engel olmasını sağlamak.

SQLServer Veritabanının Foreign key özelliği bu iki şartıda tam olarak yerine getirebiliyor aslında. Ancak benim istediğim 2.maddedeki özelliği gerçekleştirirken benim belirlediğim bir şartı sağlayan kayıtlara göz yummasıydı. Ancak benim istediğim özellik programcılar için pek tercih edilen birşey değil herhalde. Onun için farklı yöntemlerle sorunu çözmem gerekiyor.

Ali Erdoğan ve aslangeri arkadaşlar -1 id'li bir fatura tanımlamamı tavsiye etmişler.
Sanırım benim stok fiş başlık tablosu ile hesapkart tablosu arasında kurduğum ilişki yanlış anlaşılmış.
Ben fiş numarası ile değil hesap kodları "Varchar(16)" bir bağlantı kuruyorum. Fiş başlık tablosu hesapkartları tablosuna bağlanıyor.
Hesapkartları tablosunda "" kodlu bir hesapkartı açsam herhalde oda güzel bir çözüm olabilir.

İlginize teşekkür ederim.
Cevapla