foreign key alanı boş bırakabilir miyim?

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
Kullanıcı avatarı
huseyinkucuk
Üye
Mesajlar: 142
Kayıt: 29 Nis 2005 10:03
Konum: İstanbul
İletişim:

foreign key alanı boş bırakabilir miyim?

Mesaj gönderen huseyinkucuk »

Arkadaşlar merhaba...
URUNLER tablosundaki URUN_URETICISI_KODU alanı foreign key ile URUN_URETICILERI tablosundaki URUN_URETICISI_KAYIT_NO(triger ile otomatik artan primary alan) alanına bağlı.
URUNLER tablosundaki URUN_URETICISI_KODU boş kalınca haliyle hata veriyor veri tabanı; URUN_URETICILERI tablosunda null üretici kaydı olmadığı için...
Bu problemi aşmak için aklıma " 'URUN_URETICILERI' tablosundaki ilk kayda kendim null (veya 'Seçilmemiş' gibi bir değer) değer gireyim, eğer alan URUNLER tablosundaki URUN_URETICISI_KODU boşsa da bi tane triger otomatik olarak bu null alanının (URUN_URETICILERI ndeki null alanın) sıra no sunu versin URUNLER tablosundaki URUN_URETICISI_KODU alanına. " diye bi düşünce geldi... Ama bunun çok da iyi bir yol olmadığını düşündüm...
Bu işi yapabilmem için daha teknik bir yol var mı? Foreign bir alanı boş bırakabilir miyim? Yardımlarınız için şimdiden teşekkür ederim...
29.04.2005 tarihi itibariyle Delphi öğrenmeye başlayan yeni bir kullanıcı sayılabilirim.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Foreign Key alanı boş olamaz :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Foreign Key tanımlamasında ana tablodaki keylerin mutlaka required olması gerekiyor. Ancak alt tabloda bu zorunlu değil.

Burada sorun başka olsa gerek. Eğer URUNLER tablosunda URUN_URETICISI_KODU alanı NOT NULL (Required) tanımlı ise zaten hata verecektir. Ama NULL (not Required) ise zaten NULL olduğunda FOREIGN KEY kontrolü yapılmayacaktır.

Aslında her iki tablonun yapısını (SQL script, INDEXler ve FOREIGN KEYler dahil) verirseniz daha net yorum yapılacaktır.

İyi çalışmalar.
Kullanıcı avatarı
huseyinkucuk
Üye
Mesajlar: 142
Kayıt: 29 Nis 2005 10:03
Konum: İstanbul
İletişim:

Mesaj gönderen huseyinkucuk »

@Hakan hocam; sanırım @rsimsek abinin dediği gibi, foreign alanlar boş bırakılamıyor. (kanımca; ana tabloda null bi alan olursa boş bırakılabilir -ki onu da sonuçta bi numara temsil etçek, numarayı seçecez mecbur-). Ancak prosedürle felan olur sanıyorum, doğal yollardan olmaz. Ben de normal foreign key olmayan alanlarla ilişkilendircem artık, lookup sütunlar falan kullanırım... Recep abi, Hakan hocam; teşekkür ederim; çalışmalarınızda Allah'tan zihin açıklığı dilerim...
29.04.2005 tarihi itibariyle Delphi öğrenmeye başlayan yeni bir kullanıcı sayılabilirim.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Aslında FireBird'de olup da MS-SQL'de olmayan ve benim en çok canımı sıkan MS-SQL'in bir eksiği diye düşündüğüm bir konu bu diye mesajın başında belirteyim diye düşünmüştüm ama sonradan vazgeçmiştim.

Yani bu FireBird'de bu şekilde. Ama dediğim şartlarla. Yani ana tabloda mutlaka NOT NULL. Ama alt (detay) tablolarda ister NULL ister NOT NULL. Sana kalmış.

Basit bir örnek vereyim:

Kod: Tümünü seç

CREATE TABLE ILLER (
             IL_KODU VARCHAR(3)  NOT NULL,
             IL_ADI  VARCHAR(30) NOT NULL,
CONSTRAINT PK_ILLER PRIMARY KEY (IL_KODU));

CREATE TABLE ADRES_DEFTERI (
             ADRES_NO DOUBLE PRECISION NOT NULL,
             KIMLIGI  VARCHAR(100)     NOT NULL,
             ADRESI   VARCHAR(100),
             IL_KODU  VARCHAR(3),
             NOTLAR   VARCHAR(100),
CONSTRAINT PK_ADRES_DEFTERI PRIMARY KEY (ADRES_NO),
CONSTRAINT FK_ADRES_DEFTERI_IL_KODU FOREIGN KEY (IL_KODU) REFERENCES ILLER (IL_KODU) ON UPDATE CASCADE);
ILLER tablosunda IL_KODU NOT NULL tanımlı. Ancak ADRES_DEFTERI tablosunda IL_KODU NOT NULL tanımlı değil ve FOREIGN KEY tanımlaması yapılmış. ADRES_DEFTERI tablosunda IL_KODU'na ya NULL girebilirsiniz veya ILLER tablosundaki bir değeri.

Kastım bu idi.

İyi çalışmalar.
Cevapla