none
Tabloya eklenecek verinin id numarasını önceden bulma RRS feed

  • Soru

  • Merhaba. Veritabanındakı tabloya veri eklemeden önce eklenecek zaman gelecek id numarasını önceden bula bilirmiyim? Aşağıdakı tablodaki id kolonu primary key. Bu tabloya veri eklemden önce gelecek id-i bulma mümkünmü? (Max id numarasını bulub onun üzerine 1 gelmek işime yaramıyor, arada bazı veriler silinmiş ola bilir o yüzden)  

    Veritabanı postgrsql (Entity framework ve ya ado net kullanarak fark etmez)

    CREATE TABLE tablo
    (
    id serial PRIMARY KEY NOT NULL,
    name varchar(50) UNIQUE NOT NULL
    );

    1 Kasım 2019 Cuma 11:57

Yanıtlar

  • Öncelikle senaryon nedir bilmiyorum ama böyle bir şey istiyorsan mantığında ters giden bir şeyler var demektir ama düz mantık yapacak olursak önce boş bir item eklersin sonra elde ettiğin id için içeriğini güncellersin. Tabiki her zaman dummy veri güncellenmeyebilir, bu durumda bir sütun daha ekleyip (IsEdited diyelim) buna bool değer verelim ve güncellendiğinde true olsun. Böylelikle listelerken boş içerikleri göz ardı edebilirsin.

    TR| Sorunuzun yanıtı bu ise "Yanıt Olarak Öner" olarak işaretleyin, eğer faydalı bir yorum ise "Oy Ver"erek forumun işleyişine katkıda bulunabilirsiniz. EN| If this is the answer to your problem, mark "Propose as Answer" and if it is helpful, you can contribute to the workig of the forum by "Voting".

    1 Kasım 2019 Cuma 12:16
  • @egoist doğru sormuş. Sebebi neydi ki?

    1. Şayet identity özelliğinden verilecek numarayı kastediyorsan max+1 durumunda arada silinmiş kayıt olamaz. Çünkü aynı id tekrar verilmez. Ayrıca önce değil sonra öğrenmek mantıklıdır. Zira arada başka sorgu numarayı kapabilir. Bu durumda öğrendiğin numara eski olur. Olmaması için tabloyu kilitlemen gerekir. Uğraş dur.

    2. Aradaki boşlukları doldurma gafletinde ısrarcıysan, bu durumda bunu atomik yapmak için yine tüm tabloyu kilitlemen gerekir. Üstelik boşlukları bulmak gerekir. Bu durumda performans düşüşü olarak dönecektir.

    Sebebi öğrenmek en doğrusu olacak sanırım.


    www.cihanyakar.com




    1 Kasım 2019 Cuma 13:23
  • Merhaba. Veritabanındakı tabloya veri eklemeden önce eklenecek zaman gelecek id numarasını önceden bula bilirmiyim? Aşağıdakı tablodaki id kolonu primary key. Bu tabloya veri eklemden önce gelecek id-i bulma mümkünmü? (Max id numarasını bulub onun üzerine 1 gelmek işime yaramıyor, arada bazı veriler silinmiş ola bilir o yüzden)  

    Veritabanı postgrsql (Entity framework ve ya ado net kullanarak fark etmez)

    CREATE TABLE tablo
    (
    id serial PRIMARY KEY NOT NULL,
    name varchar(50) UNIQUE NOT NULL
    );

    postgreSQL ile ID'yi onceden alabilirsin, ancak unutma sen o ID'yi kullanmadan başkası kullanırsa bir anlamı kalmaz. Aldigin ID'yi kullanilmis gibi işaretleyebilirsin, ancak o isaretledigin ID'yi sen de kullanamazsın (çok çok nadiren amaci olabilen bir hareket). 

    Asil soru, neden ID'yi onceden öğrenmek istiyorsun, amaci ne olabilir ki?

    Yine de öğrenmekte istiyorsan, PK data tipini serial'dan UUID gibi bir degere değiştirebilirsin. O zaman zaten veritabanı degil sen veriyor olacaksın, istersen onceden öğrenirsin, ve öğrendiğini ID'yi kullanıp kullanmamakta özgür olursun. UUID kullanilinca, performans acısından etkileneceğini söylenebilir, ancak kullandigin veritabanı postgreSQL ve onun ekstra index tipleri, dil destegi vs ile onyargili bir degerlendirme olur (hiçbir şey yapmasan bile, farketmeni saglayacak düzeyde veriye ulaşman epey zaman alacaktır).

    Neyse, gereksiz bir şey ile ugrasiyorsun.

     



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    1 Kasım 2019 Cuma 14:22
    Yanıtlayıcı

Tüm Yanıtlar

  • Öncelikle senaryon nedir bilmiyorum ama böyle bir şey istiyorsan mantığında ters giden bir şeyler var demektir ama düz mantık yapacak olursak önce boş bir item eklersin sonra elde ettiğin id için içeriğini güncellersin. Tabiki her zaman dummy veri güncellenmeyebilir, bu durumda bir sütun daha ekleyip (IsEdited diyelim) buna bool değer verelim ve güncellendiğinde true olsun. Böylelikle listelerken boş içerikleri göz ardı edebilirsin.

    TR| Sorunuzun yanıtı bu ise "Yanıt Olarak Öner" olarak işaretleyin, eğer faydalı bir yorum ise "Oy Ver"erek forumun işleyişine katkıda bulunabilirsiniz. EN| If this is the answer to your problem, mark "Propose as Answer" and if it is helpful, you can contribute to the workig of the forum by "Voting".

    1 Kasım 2019 Cuma 12:16
  • @egoist doğru sormuş. Sebebi neydi ki?

    1. Şayet identity özelliğinden verilecek numarayı kastediyorsan max+1 durumunda arada silinmiş kayıt olamaz. Çünkü aynı id tekrar verilmez. Ayrıca önce değil sonra öğrenmek mantıklıdır. Zira arada başka sorgu numarayı kapabilir. Bu durumda öğrendiğin numara eski olur. Olmaması için tabloyu kilitlemen gerekir. Uğraş dur.

    2. Aradaki boşlukları doldurma gafletinde ısrarcıysan, bu durumda bunu atomik yapmak için yine tüm tabloyu kilitlemen gerekir. Üstelik boşlukları bulmak gerekir. Bu durumda performans düşüşü olarak dönecektir.

    Sebebi öğrenmek en doğrusu olacak sanırım.


    www.cihanyakar.com




    1 Kasım 2019 Cuma 13:23
  • Merhaba. Veritabanındakı tabloya veri eklemeden önce eklenecek zaman gelecek id numarasını önceden bula bilirmiyim? Aşağıdakı tablodaki id kolonu primary key. Bu tabloya veri eklemden önce gelecek id-i bulma mümkünmü? (Max id numarasını bulub onun üzerine 1 gelmek işime yaramıyor, arada bazı veriler silinmiş ola bilir o yüzden)  

    Veritabanı postgrsql (Entity framework ve ya ado net kullanarak fark etmez)

    CREATE TABLE tablo
    (
    id serial PRIMARY KEY NOT NULL,
    name varchar(50) UNIQUE NOT NULL
    );

    postgreSQL ile ID'yi onceden alabilirsin, ancak unutma sen o ID'yi kullanmadan başkası kullanırsa bir anlamı kalmaz. Aldigin ID'yi kullanilmis gibi işaretleyebilirsin, ancak o isaretledigin ID'yi sen de kullanamazsın (çok çok nadiren amaci olabilen bir hareket). 

    Asil soru, neden ID'yi onceden öğrenmek istiyorsun, amaci ne olabilir ki?

    Yine de öğrenmekte istiyorsan, PK data tipini serial'dan UUID gibi bir degere değiştirebilirsin. O zaman zaten veritabanı degil sen veriyor olacaksın, istersen onceden öğrenirsin, ve öğrendiğini ID'yi kullanıp kullanmamakta özgür olursun. UUID kullanilinca, performans acısından etkileneceğini söylenebilir, ancak kullandigin veritabanı postgreSQL ve onun ekstra index tipleri, dil destegi vs ile onyargili bir degerlendirme olur (hiçbir şey yapmasan bile, farketmeni saglayacak düzeyde veriye ulaşman epey zaman alacaktır).

    Neyse, gereksiz bir şey ile ugrasiyorsun.

     



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    1 Kasım 2019 Cuma 14:22
    Yanıtlayıcı