Primary key hakkında

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ı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Primary key hakkında

Mesaj gönderen bobasturk »

Merhaba arkadaşlar.

Primary key olarak arattırdım ama çıkan makalelerden sorunuma cevap bulamadım.

Şimdi firebird 1,5 ve ibexpert kullanıyorum.(öğrenmeye çalışıyorum) Önceden dbase ile yaptığım çalışmayı firebirde dönüştürmeye çalışıyorum.

Primary key olayına kafam takılıyor. Bunu muhakkak seçmelimiyim. Dataset ayarlarında birini seçmek gerekiyor ama tablo hazırlama anında primary key atamam gerekiyormu. Atayınca not null işaretini de kendisi koyuyor ve o alanı boş geçemiyorum veya aynı kaydı bir daha giremiyorum. oysa bazı tablolarda aynı isim, sayı vb. kayıtlar girilmesi gerekebiliyor. tabloda pk olan alanı çift tıklayarak not null işaretini kaldırıyorum ama tablonun grid görüntüsünde işaret yerinde duruyor.

Tabloda oluşturduğum pk olayından vaz geçmek istesem de bu sefer kaldırımıyorum bu işin içinden nassı çıkacaz bilmem.

teşekkür ve saygılarla
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

Bir tablodaki verilerin saglıgı acısından mutlaka PK kullanılmalıdır.
adından da anlasılacagı gibi PK alan tekrar etmez. genelde bir otomatik sayı uretecinden degerlerini alan bir alandır bu. yani bir tabloda isim,tel diye alanlar varsa bunlara ilaveten ID isimli PK olacak bir alan ekleyin
bir Generator olusturun bu alan icin trigger ile bu ID guncellensin her kayıtta
siz gormesenizde kullanmasanızda bu boyle olsun
bir kayıt silerken bir kayıt guncellerken , tabloları birbirine baglarken cok kullanacaksınız.bir PK iki alandan da olusabilir.
mesela URUN_NO ve REYON_NO isimli iki alanı PK tanımladıysak
su sekilde kayıtlarımız olabilir:

U R
1 1
1 2
2 1
2 2
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

Gökmen abi teşekkür ederim. Şimdi tüm tabloları değiştirmem gerekecek çünkü yanlış yerlere PK atadım ve geriye kaldıramıyorum.

Generator işine gelince bir kaç yerde okudum ama anlayamadım. Bu konuda ibexpert te yapılışını anlatan bi makale biliniyormu acaba. İlk defa oluşturacağım için başlangıçtan itibaren anlatımı lazım. Makaleleri okuyordum belki bulurum diye yardımcı olunursa iyi olucak.

Firebird ile ibexpert te generator oluşturma ve bunu gökmen abinin dediği gibi PK_ID e bağlama.

Teşekkür ve saygılarımla
Kolay gele
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

Doğrumu yaptım bilmiyorum ama ibexpert te tablonun bulunduğu yerde Constraints kısmında drop primary key diyerek PK alanları kaldırdım. Şimdi alan olarak ID ekleyip PK yapmak ama

Generator oluşturmayı önceki denememde yapamadım. Anlatan arkadaşım olursa sevinirim.

Herşey için Teşekkürler.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

ben de IbExpert kullanıyorum
oturutp generator icin tek satır kodu (mesela CREATE GENERATOR GEN_FIRMA_ID; gibi) yazmaya bile gerek yok
Id diye tanımladıgım alana cift tıklayınca acılan pencerede
AutoIncrement sekmesinde Generator tabında
Create yada Use secenekleri var
ya olustur yeni bir tane yada varolanı kullan
yoksa generator create isaretliyorsun
eger PK alanı trigger ile guncelleyeceksen aynı sekidle Trigger tabında
create trigger isaretliyorsun OK dediginde islem tamam

eger daha once olusturdugun tablodaki alanları degistireceksen
tablonun ddl ni kopyalayıp aynı tablonun bir yedegini olustur.
(generator,indecler ve trigger vs. kodları haric sadece create table kısmı)
Insert Into YedekTabloIsmi Select * from EskiTablo
ile tum kayıtları aktar
sonra EskiTablo uzerinde alanları sil yaz boz
isin bitince tekrar aktaracak sql kodunu yaz ve aktar.
Ama mutlaka yedekli calıs ,hatta IbExpertin icindeki Backup modulu ile yedegini alabilirsin yada dosyayı direkt kopyala..
bu gibi seyler usenmeye gelmiyor alimallah bir haftalık emek ucabiliyor.
kolay gelsin
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7602
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

:ara Arama kısmını kullanın lütfen.

Şair abimizin makalesi var bu konuda : "Interbase de AUTOINC Alan Oluşturmak."

Kolay gelsin.
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

Gökmen Abi bilgilerin için çok teşekkür ederim. Tablo henüz boş verileri ibpump ile dbase dosyalarından daha sonra güncelleyeceğim.

Mustafa abi sağol arama yapmakla ve biraz uğraş önerilerin doğrultusunda bayağı ilerlediğimi zannediyorum. Sizin kadar diğil tabi ama sorunlar üzerinde kafa yorup çözüm bulmaya başladım.

Primary key olarak arama yapmıştım ve lazım olan cevabı bulamayınca başlık açmıştım. Konunun mevzuu burada geçince burada devam ettim o yüzden.

Değerli zamanınızı aldığım için özür diler tekrar teşekkür ederim.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

Öncelikle belirteyimki Tool Kullanmak pratiklik kazandırıyor, ama kesinlikle SQL i yazmayı öğrenin, Tool larda commit etmeden önce SQL cümlesi ekrana geliyor IBExpert mutlaka getiriyor bunları inceleyip öğrenin.
PrKey içinse benim her zaman söylediğim şey şu, Table ın Satır numarası gibi düşünün, kullanın yada kullanmayın mutlaka her tabloya bir "ID" yada kendi belirlediğiniz bir Field ı PrKey tanımlayın, extra bir alan tanımlamak size bir şey kaybettirmez ama kazandırır.

Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
sair
Kıdemli Üye
Mesajlar: 288
Kayıt: 16 Haz 2003 04:41
Konum: Kastamonu
İletişim:

Mesaj gönderen sair »

freeman35 e sonuna kadar hak veriyorum. Yeni ba_layanlarin IBExpert gibi programlari kullanmalari son derece yanlis bence de... Bunun yerine IBConsole programini kullanin. SQL ögrenmek acisindan son derece elzem. IBExpert gibi programlar çok kolayliklar sagliyor olabilir ancak SQL bilgisini de kesinlikle tikiyor... Alter Table islemlerinde hala zorlaniyorum cünkü SQL de hic yapmadim. IBExpert le calistim hep.. Bu yüzden biraktim hepsini de tamamen SQL text ile çalisiyorum.. Durup duruken biri pat diye bir SQL komutu sorsa insan takilip kaliyor. Ama IBExpert ile basit tabi ki... Kesinlikle önerim bir SQL text kullanmaniz.. Hatta bütün veritabani islemlerinizi not defterinde yazin script seklinde calisin...

Sevgiler...
Geçip gideriz bizde ağızsız,dilsiz ve sorgusuz
İstanbul gibi düşeriz iki kıtaya birden...
En aşağılık düş, en büyük sevdadan belki
Erkek ölümler; bir uzun iç çekişle büyür göğsümüz
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

Ne zamandı bu konuda yazayım diye düşünüyordum bugüne kısmetmiş. Efm, AUTOINCREMENT olarak bildiğimiz ve rdbms lerin pekçoğu tarafından desteklenen bu unique değer üretme algoritması ne kadar sağlıklıdır ? Hoppala nerden çıktı bu dediğinizi duyar gibiyim. Şöyle bir senaryomuz olsun (ki bugünlerde pekçok firmanın kara kara düşündüğü nasıl yaparızlardan birisidir bu konu),

- Müşterimizin saha personeli verileri toplayıp sahada giriyorlar ve kendilerine ait bilgiler local db lerde duruyor.
- Müşterimizin bölge ofislerinde bu bilgiler toplanıp merkezi sisteme transfer ediliyor (buradaki merkezi db den de firma genel merkezindeki master database e transfer ediliyor)

ve bu işlemler asenkron olarak yapılıyor doğal olarak replikasyon coordinator vs bir sürü problemin çözülmesi gerekiyor.

Şimdi soru şu: "Müşteriden alınan siparişi notebook una kaydeden saha elemanının bu kaydının, genel merkezdeki karşılığıyla arasındaki bağıntı nedir ?". Yani merkezdeki kaydın, satıcının notebook undaki hangi kayıt olduğunu nasıl bileceğiz ?

Geleneksel metodla bu bilgiyi tutmaya kalktığımızda 3 aşamalı bir dönüşüm işlemine tabi tutmadan bunu eşleştirmenin olanağı yoktur. Fakat son zamanlarda başka bir PK, yada unique değer kullanılmaya başlandı biliyorsunuz. Bu yeni (aslında eskidi bile yöntem) yöntemle PK alanını GUID değerleri tutabilecek (string yada sayısal olabilir) yapıyorsunuz ve içine de üretilen GUID (global unique identifier) değerini koyuyorsunuz. Tablolar arasındaki releation larda FK ler de bu değerlerden oluşuyor doğal olarak. Bu sayede gerek replikasyon ve gerekse asenkron veri aktarımında kaydın gerçekten diğer hiçbir kayıtta olmayan (diğer tablolar da dahil) olmayan bir id si oluyor. Bu sayede arada herhangi bir çevirim e gerek olmadan verileri değişik veritabanlarında eşleyebiliyoruz.

String indexler performans sorununa neden olabileceğinden, guid bilgisi sayısal olarak da tutulabilir. Bu yaklaşımla özellikle aynı veri asenkron replike edilen değişik databaselerde duruyorsa oldukça pratik çözümler üretilebilir.

Bu yöntemi geniş çaplı bir uygulamada kullanmadım ama kullananlardan aksayan bir yönünü henüz duymadım.

Kolay gelsin,
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
sair
Kıdemli Üye
Mesajlar: 288
Kayıt: 16 Haz 2003 04:41
Konum: Kastamonu
İletişim:

Mesaj gönderen sair »

Doğan Bey Teşekkürler ama şu konuyu biraz daha açarmısınız.. İlgimi çekti.. Örnek vererek mesela...

Sevgiler..
Geçip gideriz bizde ağızsız,dilsiz ve sorgusuz
İstanbul gibi düşeriz iki kıtaya birden...
En aşağılık düş, en büyük sevdadan belki
Erkek ölümler; bir uzun iç çekişle büyür göğsümüz
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

Nasıl bir örnek verebilirim... Himm. Delphi + MS SQL Server çalışıyorsunuz diyelim.. Bir stok, bir stok hareket ve bir de fatura tablonuz var. Gelenksel yöntemle;

fatura: PK faturaid,
stok: PK stokid,
stokhar: PK stokharid, FK faturaid,FK stokid

id değerleri autoincrement. Bir faturayı aktardığınızda mevcut bir database e, FK alanların güncelleştirilmesi gerekecektir. (zira orjinal tabloda bunlarin id leri farklı olabilir/olacaktır)

Bu bahsettiğim yöntemde ise bu id alanları GUID. Haliyle siz burdaki tabloları host database deki tablolara doğrudan merge ediyorsunuz. id lerle falan uğraşmıyorsunuz. Windows API ları içinde GUID üreten bir tanesi var bunu kullanabilirsiniz.
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

Biryerde Hata yaptık ama bilemiyorum. ibexpertte hazırladığım tabloları ibpump ile yine önce PK_IDNO alanı olmayan ibexpert ile hazırlanmış tablolardan veri aktarmak istedim ama yapamadım. Dbase tablodan çekmiştim Şimdi olmuyor.

Yukarıdaki sorum ve cevaplar doğrultusunda tekrar tablo hazırladım ve önceki tablodan farklı olarak IDNO alanı ekledim ve PK yaptım bu tabloyu oluşturduktan sonra PK yi çift tıklayarak creat generator dedikten sonra Autoincrementi açarak oradada creat işaretleyip tabloyu oluşturmayı bitirdim. Ibpump aktarım halinde iken IDNO ları error olarak gösterdi. ve tablolara baktığımda boş olduklarını gördüm. şimdi burada ne yapmalıyım. Eski tabloya ıdno eklesem ve pk yapsam düzelirmi acaba yardımcı olabilirmisiniz.

Teşekkür ve saygılarla
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

@olc Datapup kullanmadan delphi ile yap, kontrol senin elinde olsun. Ayrıca generator ın mantığını kavramaya çalış. datapup kullanıcaksan ve bu alan master da yoksa aktaracağın table da triger da generate ettirmen lazım.

@doganzorlu Güzel öneriler, bunu makale haline getirme şansınız olursa foruma eklersek çok kişi faydalanıcaktır. Söylediğiniz yöntemi ben en son projemde kullanıyorum. Şirketin 5 şubesi var ve şubelerde satış yapan bir kuyumcu. dövizlede çalışıyor. Kendi stoklarını kendileri giriyorlar, kendi aralarında mal alışverişi yani virman yapıyorlar, birde merkez var burası muhasebe yani kasaların günlük işlemlerin kontrol edildiği yer. her sabah şubeler ister CD ye yazarak ama son zamanlarda hepsi mail atarak günlük yaptıkları işleri merkeze gönderiyorlar merkezde bu işleri kontrol ediyorlar. Şimdiye kadar büyük bir problem çıkmadı, ufak tefekler hariç yani virman yapılırken stok bilgisinin bazı değerlerinin değişmesi yada değşimemesi gerek gibi işletmenin keyfine yönelik düzeltmeler. Bu sistemin çalışmasının temeli PRkey ler ben GUI kullanmıyorum, her yerde Generator kullandım. Database FireBird 1.5

Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

Freeman35 ustam şu an ona kafa yoruyorum ama bu kafa ile bu kadar. Eski tablomdaki alanlara IDNO ekledim ve bu alanları PK_NOT NULL yaparak gen oluşturduktan sonra trigger oluşturuyorum. Şimdilik delphi üzerinde yapmayı beceremiyorum. Şair abinin anlattığı makaleyi okudum fakat oldukça iyi olanlara göre anlatılıyor. verdiği kodları hangi yere yazacağımı bilemediğimden çekiniyorum. Fakat bilmelisiniz ki onuda öğreneceğim. Bu takip ettiğim yolda acaba aktarım olurmu bilmiyorum deneyeceğim. Korkum eski tabloya eklediğim IDNO alanları boş bu durumdan dolayı aktarım yaparmı bilmiyorum. yoksa hepsini elle dolduracağım veya monitöre bakıp kara kara düşüneceğim.

Teşekkür ederim.Saygılarımla
Cevapla