FBde iki tane PK oluşturmak...

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Kullanıcı avatarı
comlekciler
Üye
Mesajlar: 58
Kayıt: 17 Nis 2006 12:35

FBde iki tane PK oluşturmak...

Mesaj gönderen comlekciler »

Selam arkadaşlar,

FB de iki tane tablo yaptım amacım iki tane PK olabilir mi diye bir deneme yapmak istedim. IBExpert Personal kullanıyorum.

MasterTablo; MÜŞTERİ
sirano -> PrimaryKey(PK1) integer
musterikodu -> PK2 varchar(20)
adi
soyadi
borcu

DetayTablo; SİPARİŞ
sirano ->PrimaryKey(PK1) integer
musterikodu -> FK varchar(20)
urunismi
borcu
odeme

Buradaki Detay Tabloda musterikodu nu FoeringKey yapmak istediğim zaman

Kod: Tümünü seç

---------- STATEMENT ----------

alter table TBL_SIPARIS
add constraint FK_TBL_SIPARIS_1
foreign key (MSTRKODU)
references TBL_MUSTERI(MUSTERIKODU)
on delete CASCADE
on update CASCADE


---------- ERROR MESSAGE ----------

This operation is not defined for system tables.
unsuccessful metadata update.
could not find UNIQUE INDEX with specified columns.
şeklinde bir hata alıyorum.

Amacım her tablodada PK1 olacak ama bunlar sıra ile artacak sıra numarası için, diğer master tabloda MUSTERIKODU PK2, detay tabloda da MUSTERIKODU FK olacak ama bir türlü olmuyor.

Sorunum ne anlamadım neden olmuyor? Yadımlarınızı bekliyorum...

Şimdiden teşekkürler.
"Bilgisizlerin geçtikleri mevkiye yaptığı fenalığı, yüzlerce aslan bir araya gelse yapamaz" MEVLANA
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
müşteri kodunu pkey yapmanıza gerek yok.
uniq indeks tanımlarsanız yeterli olur.

vt nizi backup restore yaptıktan sonra tekrar deneyin.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
comlekciler
Üye
Mesajlar: 58
Kayıt: 17 Nis 2006 12:35

Mesaj gönderen comlekciler »

a.s. @aslangeri,

Teşekkür ederim dediğin şekilde oldu ama neden hala iki tane PK ile olmuyor anlamış değilim. Eğer iki tane PK ile hiç bir şey yapamayacaksak IBExpert neden desteklesin ki diyede aklıma bir soru geliyor... :roll:
"Bilgisizlerin geçtikleri mevkiye yaptığı fenalığı, yüzlerce aslan bir araya gelse yapamaz" MEVLANA
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
sanırım bir kavram karışıklığı var.
ikitane pkey mantık olarak olamaz. çünkü pkey adı üstünde birinci alan ve bir tane birinci olmak durumunda.
ancak birden fazla alanı pkey olarak kullanabilirsiniz.
birden fazla alanı pkey olarak kullandığınız zamanda bu alanlar tek başlarına uniq olmadıkları için bu pkey i kullanarak fk yapamazsın.
umarım iyice karışmamıştır.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
comlekciler
Üye
Mesajlar: 58
Kayıt: 17 Nis 2006 12:35

Mesaj gönderen comlekciler »

aslangeri yazdı:...birden fazla alanı pkey olarak kullandığınız zamanda bu alanlar tek başlarına uniq olmadıkları için bu pkey i kullanarak fk yapamazsın...
a.s. cevaplarınız için teşekkürler...

Burada tek başına uniq olmadıkları derken ne demek istediniz? Ben PK yaptığım zaman otomatik olarak zaten Unique alan olmuyorlar mı? Yani ikiside kendi içlerinde Unique alan olarak kayıt yapmıyorlar mı? O zaman şöyle diyebilir miyiz PK2 yaptığımız alanı ayrıyeten tekrar Unique alan mı yapmamız gerekiyor...
"Bilgisizlerin geçtikleri mevkiye yaptığı fenalığı, yüzlerce aslan bir araya gelse yapamaz" MEVLANA
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Birincil indeks yani Primary Key eşsiz olmak zorunda. Tek eşsiz bir alandan oluşabileceği gibi birden fazla alanın birleşiminden de oluşabilir. Sonuçta eşsiz olmak zorunda. Yani her bir indeks tek bir kayıtı göstermek zorunda :idea: Fakat ihtiyaç varsa özellikle sorgularda perfomans için sorguların where kısmında kullanılacak alanlardan da ikincil indeksler / secondery key oluşturulur. Sıralama ve listelemeler için ikincil indeksler birden fazla alandan oluşabilir. Foreign olayı da başka bir şeydir. Burada kurulan ilişkide ilgili alanın/alanların karşı tabloda olması garantilenir. Örneğin il adları ve plaka numaraları olan yardımcı bir tablonuz var. Bir de adresleri girdiğiniz bir tablo var. Orada plaka numarasını girerken karşı tabloda kayıtı olanlar dışında bir değer girilmemeli. Bu da veritabanı tutarlılığı / referential integrety için gerekli bir tasarımdır.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

@comlekciler
şöyle bir örnek verip açıklayım.
şöyle bir tablomuz olduğunu düşünelim

Kod: Tümünü seç

ilkodu ilce kodu adı
06     01   mamak
06     02   altındağ
06     03   çankaya
19     01   alaca
19     02   sungurlu
19     03   iskilip
bu tabloda pkey olarak ilkodu ve ilçe kodu alanlarını beraber yaparsak
ilkodu alanıda ilçe kodu alanıda tek başlarına unique olmuyorlar.
bunu kastetmiştim.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
comlekciler
Üye
Mesajlar: 58
Kayıt: 17 Nis 2006 12:35

Mesaj gönderen comlekciler »

@aslangeri çok teşekkür ederim.

Yani her iki alan birlikte PK ve UNIQUE oluyorlar. Ben şu şekilde yapınca oldu,

MasterTablo; MÜŞTERİ
sirano -> PrimaryKey(PK1) integer
musterikodu -> PK2 ve UNIQ varchar(20)
adi
soyadi
borcu

DetayTablo; SİPARİŞ
sirano ->PrimaryKey(PK1) integer
musterikodu -> FK varchar(20)
urunismi
borcu
odeme

MasterTablodaki PK2 yi aynı zamanda UNIQUE alan yaptım ve DetayTablodaki "musterikodu" ile FK tanımladım ve kabıul etti. Şu haliyle çalışıyor. İnşallah yanlış bir şey yapmamışımdır. :roll:

Tekrar çok teşekkürler. :)
"Bilgisizlerin geçtikleri mevkiye yaptığı fenalığı, yüzlerce aslan bir araya gelse yapamaz" MEVLANA
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Sanırım bir yanlış anlaşılma var ben bunu gidermek isterim.

Primary Key, denen şey aslında Tek bir Field değildir. Bir veya daha fazla Field (Alan'dan) oluşan bir Index'tir. Genelde Clustered yapılmasında fayda vardır ve Daima Unique'dir ve Tablonun ana Indexidir.

Bir tabloya en fazla bir adet PK tanımlayabilirsiniz ama dediğim gibi bir PK içinde birden fazla alan olabilir.

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
comlekciler
Üye
Mesajlar: 58
Kayıt: 17 Nis 2006 12:35

Mesaj gönderen comlekciler »

Kuri_YJ yazdı:...Genelde Clustered yapılmasında fayda vardır ve Daima Unique'dir ve Tablonun ana Indexidir...
Selam @Kuri_YJ,

Bende senin gibi tüm PK ler aynı zamanda UNIQUE diye biliyordum ama aşağıdaki gibi hata verdi.

Kod: Tümünü seç

---------- ERROR MESSAGE ---------- 

This operation is not defined for system tables. 
unsuccessful metadata update. 
could not find UNIQUE INDEX with specified columns.
Yani aynı tabloda PK1 ve PK2 vardı ve ikinci PK2 olan alanda bu hatayı verdi (ilk mesajda tablolar mevcut). Ama bu ikinci PK2'yi UNIQUE alan olarak ayrıyeten tanımlayınca sorun ortadan kalktı. Sanki PK2 Unique alan değilmiş gibi işlem yapıyordu. (Aklıma gelen son bir şeyde IBExpert Personal sürümünde bir hata olması... :roll: )

Kolay gelsin...
"Bilgisizlerin geçtikleri mevkiye yaptığı fenalığı, yüzlerce aslan bir araya gelse yapamaz" MEVLANA
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Hata mesajıı gördüysenz uyarıda diyor ki, bu işlem sistem tabloları için geçerli değildir diyor.

Her ne yapmak istiyorsanız, sistem tablolarına bir efekti var ve yapmaya çalıştığınız işlemde bu sebeple yapılamıyor.

Bence son durum olarak,
Kullanmaya çalıştığınız Tabloların tam yapılarını verin,
Kullanmaya çalıştığınız tablolara ait bütün index ve PK'ları verin,
Oluşturmaya çalıştığınız ForeignKey'lerin yapılarını verin.

Ben de burada deneyeyim bakalım ne diyecek. Afaki olmasın, reel olarak bir görelim o zaman sebebini anlarız diye tahmin ediyorum.

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

bkz: Seminerler,
bkz: Fahrettin abinin veritabanı seminerleri,
mutlaka bkz: Fahrettin abinin veritabanı seminerleri...
Kullanıcı avatarı
comlekciler
Üye
Mesajlar: 58
Kayıt: 17 Nis 2006 12:35

Mesaj gönderen comlekciler »

selam,

Dediğim gibi sadece aklıma takılmıştı deneme yapmak için bir tabloda iki tane PK olursa ne olur diye çalışma yaptım öyle büyük bir database falan değil. Müşteri ve sipariş adına basit master-detail ilişkili bir VT dosyasıydı. IBExpert Personalda aşağıdaki tabloları yaparsanız bu hatayı veriyor sadece dediğim gibi master tablodaki PK2yi UNIQUE alan yapmayın ve detay tabloda onu FK yapın. Eğer PK2yi ayrıyeten UNIQUE alan yaparsanız kabul ediyor.

MasterTablo; MÜŞTERİ
sirano -> PrimaryKey(PK1) integer
musterikodu -> PK2 varchar(20)
adi
soyadi
tplmborcu

DetayTablo; SİPARİŞ
sirano ->PrimaryKey(PK1) integer
musterikodu -> FK varchar(20)
urunismi
borcu
odeme

sirano'lar PK ve GENERATOR ile otomatik artıyor. Mastertablodaki "musterikodu" olan alan PK2 ve detay tablodaki "musterikodu" ise FK olarak tanımlı. Diğer bir dikkat edeceğiniz ben PK2yi ve FKyi VARCHAR(20) olarak tanımladım.

Bir deneyin isterseniz. İlginiz için çok teşekkürler.

Kolay gelsin.
"Bilgisizlerin geçtikleri mevkiye yaptığı fenalığı, yüzlerce aslan bir araya gelse yapamaz" MEVLANA
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Siz herhalde şunu karıştırıyorsunuz, Siz 2 tane Primary Key tanımlamamışsınız ki. Bakın Her Tabloya 1 Adet Primary Key tanımlanır. Dikkat edin, Tabloya. Bir Database'de 1500 Tablo varsa 1500 Adet Primary Key tanımlayabilirsiniz. Ama Her Tablo sadece bir tane PK içerebilir.

Bunu ayırt ederseniz işlem olur. Dosya yapılarınızı EMS'de Script Generate ettirerek verin. Bu böyledir diye vermeyin, o zaman ben de size

FK'yı PK'larla bağlarsanız olur diye yanıt dönerim ama anlaşamamış oluruz :)

Tam yapıyı verin, indexlerinize kadar SCRIPT'leri dökün.

ok?


Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
comlekciler
Üye
Mesajlar: 58
Kayıt: 17 Nis 2006 12:35

Mesaj gönderen comlekciler »

Kuri_YJ yazdı:...Bir tabloya en fazla bir adet PK tanımlayabilirsiniz ama dediğim gibi bir PK içinde birden fazla alan olabilir...
Selam,

Siz böyle bir cümle demiştiniz yani bir tablo içerisinde farklı alanlar olmak üzere iki veya daha fazla PK olabilir diye (eğer yanlış bir sonuç çıkartmamamışsam :oops: )

ikincisi eğer böyle bir şey yoksa resimdeki gibi bir duruma IBExpert neden izin veriyor yada ne amaçlı kullanılabilir?

Resim

İkinci bir husus istedikleriniz sanırım aşağıdakiler eğer yanlış anlamadıysam...


TBL_MUSTERI adında Master Tablo;

Kod: Tümünü seç

/******************************************************************************/
/****              Generated by IBExpert 27.07.2006 14:59:56               ****/
/******************************************************************************/
SET SQL DIALECT 3;

SET NAMES WIN1254;
/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/
CREATE TABLE TBL_MUSTERI (
    SIRANO       SAYI NOT NULL /* SAYI = INTEGER */,
    MUSTERIKODU  KARAKTER NOT NULL /* KARAKTER = VARCHAR(20) */,
    ADI          KARAKTER /* KARAKTER = VARCHAR(20) */,
    SOYADI       KARAKTER /* KARAKTER = VARCHAR(20) */,
    TPLMBORCU    PARA /* PARA = DOUBLE PRECISION */
);
/******************************************************************************/
/****                          Unique Constraints                          ****/
/******************************************************************************/
ALTER TABLE TBL_MUSTERI ADD CONSTRAINT UNQ1_TBL_MUSTERI UNIQUE (MUSTERIKODU)
USING INDEX UNQ_MUSTERIKODU;
/******************************************************************************/
/****                             Primary Keys                             ****/
/******************************************************************************/
ALTER TABLE TBL_MUSTERI ADD CONSTRAINT PK_TBL_MUSTERI PRIMARY KEY (SIRANO, MUSTERIKODU);
/******************************************************************************/
/****                              Privileges                              ****/
/******************************************************************************/
TBL_SIPARIS adında Detay Tablo;

Kod: Tümünü seç

/******************************************************************************/
/****              Generated by IBExpert 27.07.2006 15:07:07               ****/
/******************************************************************************/
SET SQL DIALECT 3;

SET NAMES WIN1254;
/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/
CREATE TABLE TBL_SIPARIS (
    SIRANO       SAYI NOT NULL /* SAYI = INTEGER */,
    MUSTERIKODU  KARAKTER /* KARAKTER = VARCHAR(20) */,
    TARIH        TARIH /* TARIH = DATE */,
    URUNISMI     KARAKTER /* KARAKTER = VARCHAR(20) */,
    BORCU        PARA /* PARA = DOUBLE PRECISION */,
    ODEME        PARA /* PARA = DOUBLE PRECISION */
);
/******************************************************************************/
/****                             Primary Keys                             ****/
/******************************************************************************/
ALTER TABLE TBL_SIPARIS ADD CONSTRAINT PK_TBL_SIPARIS PRIMARY KEY (SIRANO);
/******************************************************************************/
/****                             Foreign Keys                             ****/
/******************************************************************************/
ALTER TABLE TBL_SIPARIS ADD CONSTRAINT FK_TBL_SIPARIS_1 FOREIGN KEY (MUSTERIKODU) REFERENCES TBL_MUSTERI (MUSTERIKODU) ON DELETE CASCADE ON UPDATE CASCADE
  USING INDEX FK_MUSTERI_SIPARIS;
/******************************************************************************/
/****                              Privileges                              ****/
/******************************************************************************/
Burada bunu kabul edebilmesi için dediğim gibi master tablodaki PK2 olan musterikodu ksımını ayrıca UNIQUE alan olarak tanımlamak zorunda kaldım.

Teşekkürler kolay gelsin...
"Bilgisizlerin geçtikleri mevkiye yaptığı fenalığı, yüzlerce aslan bir araya gelse yapamaz" MEVLANA
Cevapla