Rezultate 1 la 7 din 7

Subiect: Cum pot sa anticipez ID-ul?

  1. #1
    Avatarul lui Federals
    Federals este deconectat Ambasador
    Reputatie:
    33
    Data înscrierii
    29th November 2007
    Locaţie
    Bucuresti
    Posturi
    612
    Putere Rep
    33


    Implicit Cum pot sa anticipez ID-ul?

    Am intr-o baza de date MySQL un primary key ID. Stiti ca acesta fiind unic, daca am de exemplu 3 inregistrari (1, 2, 3), si sterg inregistrarea numarul 3, la o alta adaugare ID-urile vor fi (1, 2, 4). Adica 3-ul nu va mai fi adaugat, chiar daca a fost sters.

    Pe mine ma intereseaza sa anticipez acest ultim ID, adica sa nu ma bazez pe "SELECT id FROM table ORDER BY id DESC LIMIT 1", apoi sa adun 1, fapt care imi returneaza 3 in caz ca id-ul 3 a fost sters, desi in baza de date dupa adaugare, ID-ul va fi 4.

    Stiu ca pot sa iau ID-ul abia dupa adaugare, dar pe mine ma intereseaza inainte de adaugarea in baza de date.

    M-ar interesa si pentru MSSQL.

    Mersi!

  2. #2
    Avatarul lui Bruzli
    Bruzli este deconectat Administrator
    Reputatie:
    42
    Data înscrierii
    25th April 2005
    Locaţie
    Oradea
    Vârstă
    46
    Posturi
    980
    Putere Rep
    42


    Implicit

    Pentru mysql ai SHOW_TABLE_STATUS care intoarce un camp Auto_Increment

  3. #3
    Avatarul lui Federals
    Federals este deconectat Ambasador
    Reputatie:
    33
    Data înscrierii
    29th November 2007
    Locaţie
    Bucuresti
    Posturi
    612
    Putere Rep
    33


    Implicit

    Mersi! Cred ca o sa merg totusi pe afisarea ID-ului dupa insert, ca sa nu fie probleme de concurenta la adaugare, ca la asta nu ma gandisem initial

  4. #4
    Avatarul lui Gabriel Puscuta
    Gabriel Puscuta este deconectat Ambasador
    Reputatie:
    37
    Data înscrierii
    7th September 2006
    Locaţie
    Sibiu
    Posturi
    786
    Putere Rep
    37


    Implicit

    Mai bine ai baga toate datele in sesiuni si apoi faci insert-ul cu toate.

    Daca nu ai asa:

    Cod PHP:
    <?php
    $urmatorul_id 
    0;
    $sql = ("SHOW TABLE STATUS LIKE 'nume_tabel'");
    $result mysql_query($sql) or die(trigger_error(mysql_error()));
    $row mysql_fetch_array($result);
    $urmatorul_id $row['Auto_increment'];
    echo 
    $urmatorul_id;
    ?>
    Ultima modificare făcută de Gabriel Puscuta; 25th September 2008 la 13:08.

  5. #5
    Avatarul lui Federals
    Federals este deconectat Ambasador
    Reputatie:
    33
    Data înscrierii
    29th November 2007
    Locaţie
    Bucuresti
    Posturi
    612
    Putere Rep
    33


    Implicit

    mersi pgabriel!

  6. #6
    Avatarul lui Dever
    Dever este deconectat Ambasador
    Reputatie:
    35
    Data înscrierii
    28th July 2006
    Locaţie
    UK
    Vârstă
    43
    Posturi
    378
    Putere Rep
    35


    Implicit

    "SELECT id FROM table ORDER BY id DESC LIMIT 1"
    Pe mine m-ai pierdut un pic la "sterg id-ul 3 ... si apoi nu stiu cum iti intoarce 3 dar e 4 ... DAR ... poti folosi (daca nu ma insel este si o idee mai repede, probabil un 0,00000ceva) si
    Cod:
    SELECT MAX(id) FROM table
    De asemenea nu te opreste nimeni sa nu folosesti o alta coloana, id-ul ar trebui sa fie unic si atat. Depinde ce anume vrei sa faci ... dar plec ipotetic de la ideea ca ai nevoie de un numar incrementat care sa isi pastreze toate valorile ocupate (un fel de ordine a elementelor independenta de id) si zic ca ai putea sa faci asa:

    - cand faci insert iei MAX(numar)+1;
    - daca vrei sa stergi un numar din serie (stergi numarul 5 din seria 1-20) poti sa stergi 5:
    Cod:
    DELETE FROM table WHERE id=5; si apoi modifici restul
    UPDATE table SET numar=numar-1 WHERE id>5;
    Dever's Blog - Atentie! dau cu parerea.

  7. #7
    Avatarul lui Ciprian.Olaru
    Ciprian.Olaru este deconectat Membru SeoPedia
    Reputatie:
    0
    Data înscrierii
    6th August 2007
    Locaţie
    Bucuresti
    Posturi
    573
    Putere Rep
    0


    Implicit

    Citat Postat în original de Dever Vezi Post
    Pe mine m-ai pierdut un pic la "sterg id-ul 3 ... si apoi nu stiu cum iti intoarce 3 dar e 4 ... DAR ... poti folosi (daca nu ma insel este si o idee mai repede, probabil un 0,00000ceva) si
    Cod:
    SELECT MAX(id) FROM table
    De asemenea nu te opreste nimeni sa nu folosesti o alta coloana, id-ul ar trebui sa fie unic si atat. Depinde ce anume vrei sa faci ... dar plec ipotetic de la ideea ca ai nevoie de un numar incrementat care sa isi pastreze toate valorile ocupate (un fel de ordine a elementelor independenta de id) si zic ca ai putea sa faci asa:

    - cand faci insert iei MAX(numar)+1;
    - daca vrei sa stergi un numar din serie (stergi numarul 5 din seria 1-20) poti sa stergi 5:
    Cod:
    DELETE FROM table WHERE id=5; si apoi modifici restul
    UPDATE table SET numar=numar-1 WHERE id>5;

    ma indoiesc ca asta era cerinta (oricum, dupa mine e o metoda de evitat);

    daca intuiesc bine scopul pentru care trebuie anticipat id (adica acela de a avea idul randului inserat fara a face un select suplimentar dupa) cred ca poti folosi asta: http://dev.mysql.com/doc/refman/5.0/...unique-id.html
    in felul asta cu siguranta nimeresti idul pt ca tocmai l-ai introdus (daca totusi ai dubii poti incerca sa folosesti tranzactii pentru toate pachetele de date prelucrate - parca de ceva vreme stie si mysql de asta) si il poti folosi linistit mai tarziu (la orice interval de timp) chiar daca alt set de date iti insereaza un nou rand in tabela initiala;


    bafta,

Informații subiect

Utilizatori care navighează în acest subiect

Momentan este/sunt 1 utilizator(i) care navighează în acest subiect. (0 membrii și 1 vizitatori)

Permisiuni postare

  • Nu puteţi posta subiecte noi.
  • Nu puteţi răspunde la subiecte
  • Nu puteţi adăuga ataşamente
  • Nu puteţi modifica posturile proprii
  •