1. Здраво и добредојдовте на форумот на IT.mk.

    Доколку сеуште не сте дел од најголемата заедница на ИТ професионалци и ентузијасти во Македонија, можете бесплатно да се - процесот нема да ви одземе повеќе од 2-3 минути, а за полесна регистрација овозможивме и регистрирање со Facebook и Steam.
    Сокриј

AUTO_INCREMENT Помош

Дискусија во форумот 'Microsoft SQL Server, MySQL, PostgreSQL, Oracle, S' започната од mimica, 12 Јуни 2016.

  1. mimica

    mimica
    Intern

    70
    16
    15 Декември 2010
    Женско
    Здраво сакам да прашам како да го решам проблемов:
    Имам mysql база во која ги внесувам податоците id ми е наместено AUTO_INCREMENT па во базата се запишуваат податоците почнувајќи од 1,2,3,4,5,6,7...
    Е сега сакам ако на пример ид 3 го избришам, следниот запис да се запише под ид3 а не под ид8.

    Благодрам,
    Мислам дека сум јасна што сакам да потигнам.

    Благодарам.
     
  2. DrMTR

    DrMTR
    Guru

    6,251
    6,378
    27 Март 2014
    Вака..

    претходно:

    [​IMG]

    бришам еден ред:

    Код:
    DELETE FROM tmp
    WHERE
    ID=3;
    добивам:

    [​IMG]

    Внесувам ова во terminal / php скрипта:

    Код:
    SET @num := 0;
    UPDATE tabelata SET id = @num := (@num+1);
    ALTER TABLE tabelata AUTO_INCREMENT = 1;
    
    После командиве погоре:

    [​IMG]

    така да немаш дупки помеѓу ID-ата. :)
     
    Последна промена: 12 Јуни 2016
    mimica, Motherboard и на bxxxn им се допаѓа ова.
  3. mimica

    mimica
    Intern

    70
    16
    15 Декември 2010
    Женско
    Ти благодарам.
    Проблемот е решен може да се затвори темата.
     
  4. Pulse

    Pulse
    Practice makes perfect

    1,187
    1,241
    26 oктомври 2014
    Машко
    Full Stack Web Developer
    Баш ми интересира за која примена би го користил ова?
    ако имаш produkti.php?id=10 и кога ќе ги направиш редните броеви без „дупки“ ова ќе се промени во id 9 и кога ќе пристапиш со id 10 ќе ти даде друг продукт.
    Боље реши го ова со оваа логика:
    доколку редниот број постои во табела, селектирај го тој ред, доколку не прикажи порака или нешто слично :)
     
  5. mimica

    mimica
    Intern

    70
    16
    15 Декември 2010
    Женско
    Ако ова преставува проблем, Тогаш кажете ми како да го средам. Новиот запис да се запише во празното место.

    Пр.
    1
    2
    3
    4
    5
    6

    Ја бришам 4-та. и следниот запис да се запише под реден број 4. Немора да се изместуваат.
     
  6. Fatal1ty_

    Fatal1ty_
    Großmeister

    21,473
    25,515
    28 Февруари 2008
    Машко
    Experienced Web Developer
    А зашто ти е всушност толку битно дали ќе бидат распоредени? id's ти има голема улога во целата скрипта или...?
     
    На mimica му/ѝ се допаѓа ова.
  7. DrMTR

    DrMTR
    Guru

    6,251
    6,378
    27 Март 2014
    е ајде де ако знаеш кажи како да го направи тоа? Јас така знаев, така и покажав.
     
    На mimica и Fatal1ty_ им се допаѓа ова.
  8. Pulse

    Pulse
    Practice makes perfect

    1,187
    1,241
    26 oктомври 2014
    Машко
    Full Stack Web Developer
    Да речеме имаш 10 записи во база со ИД од 1 до 10.
    Ги бришеш 3,5 и 7.
    Остануваат 1,2,4,6,8,9,10.
    При посета на produkti.php?id=5
    пишуваш нешто вакво
    Код:
    $id = $_GET['id'];
    $prebaraj = mysql_query("SELECT * FROM `tabela` WHERE `id` = '$id'") or die();
    if(mysql_num_rows($prebaraj) == 0){
       echo "produktot ne postoi ili e izbrishan!";
    } else if(mysql_num_rows($prebaraj) == 1){
       echo "produktot postoi";
    }
    мислам дека најлогично и најлесно е ова решение, нема потреба да потполнуваш „дупки“!
     
  9. DrMTR

    DrMTR
    Guru

    6,251
    6,378
    27 Март 2014
    работата е што таа сака да ги потполнува дупките. :)

    Сака после бришењето на ID3 на пример да следниот ред што ке се внесе во табелата да го заземе тоа место првин, па после да продолжи од најголемото id натака со секој следен ред внесен во табелата.
     
  10. kebe

    kebe
    Gaining Experience

    215
    172
    29 Март 2012
    Ова не е решение ова е проблем.
    Ова го ја менува врендноста на ИД на еден куп записи или со еден збор смрт.
     
    На Pulse му/ѝ се допаѓа ова.
  11. Pulse

    Pulse
    Practice makes perfect

    1,187
    1,241
    26 oктомври 2014
    Машко
    Full Stack Web Developer
    доколку навистина треба баш така да работи скриптата, може да се смислат повеќе начини како да работи цела скрипта.
    1) Да зачувуваш на посебно место кои ИД-а се избришани
    2) Да пребаруваш низ цела база кои ИД-а фалат за да се пополни едно од нив
    3) Да бараш дали е точно ИД со ИД+1
    и уште еден куп начини :) you choose :)
    се сложувам со ова...
     
    На kebe му/ѝ се допаѓа ова.
  12. kebe

    kebe
    Gaining Experience

    215
    172
    29 Март 2012
    Треба да напишиш прашалник, а можеби и скалдирана функција, што пред секое внесување ќе го бара најмалиот слободен број. Не е ефикасно, бавни ќе бидат внесувањата кога табелата ќе стане голема.

    Друго решение е при секое бришење во друга табела да се бележат слободните (избришани) ИД-а.

    Трето решение е воопшто да не се обидуваш ова ИД да го држиш последователно. Тоа патем е вешатчки клуч и нема некое значење, последователноста ништо не значи. Ако можеш најди друг примарен клуч што не е вешатчки, искористи веќе постоечки атрибут од ентитетите т.е. табелите.
     
  13. DrMTR

    DrMTR
    Guru

    6,251
    6,378
    27 Март 2014
    Точно !! Дури и прашање на преме е кога ке настане проблем со базата поради таквите бриши пополни операции..
     
  14. pLaToOn

    pLaToOn
    Gaining Experience

    227
    189
    24 Јануари 2012
    Машко
    Може и да не е проблем промена на редните броеви. Не е кажано зошто се користи табелата и дали тие броеви некаде се поврзани. Иако не се согласувам дека треба Alter на табелата, туку исто би одел со Update - веќе знаеме кој Id се брише па лесно е да се смени Id=Id+1 каде Id>xx. Може да има драстична заштеда во време ако е табела со милион записи а се избрише претпоследниот :)
    Нејсе, ако мора се оди на пополнување, а при тоа да се задржат оригиналните редни броеви, тогаш подобро воопшто да не се брише туку да се маркира како бришан. Едноставно да се додаде нова колона izbrisan (true/false). На наредно внесување „дупката“ лесно ќе се пронајде по статусот izbrisan, па наместо Insert ќе се направи update со limit 1 и order by Id. Секако покрај другите вредности ќе треба да се смени и вредноста во колона izbrisan.
     
    Последна промена: 12 Јуни 2016
    На Pulse и P.Overdrive им се допаѓа ова.
  15. ChemicalAngel

    ChemicalAngel
    Gaining Experience

    793
    208
    24 ноември 2008
    Никогаш не прави вакви работи, id-та на табелите треба да бидат секогаш вештачки клуч, а не бизнис т.е треба да бидат користени само како индекси/страни клучеви т.е database related stuff, не бизнис related за да немаш проблеми потоа.
     
    На DrMTR му/ѝ се допаѓа ова.
  16. kebe

    kebe
    Gaining Experience

    215
    172
    29 Март 2012
    Овој муабет е веќе надвор од темава, сепак да искоментирам оти јас не би се согласил со ова. Од која книга ја прочита оваа препорака?

    Да речеме дека имаме табела т.е. релација Јазик. Тука веќе имаме очигледен природен примарен клуч, името на јазикот. Постојат дури кодови на јазикот, mk, sr, en. Сигурно не би ставил некое бројче за клуч. Или за табела Човек би користел матичен број ако таа информација е достапна, нема да ставан нешто десетто.

    Вештачки клуч се става ако не ти е очигледен клучот на почеток или пак ако после анализа со функциски зависности добиеш некој огромен клуч со 5-6 атрибути. Тогаш не е практично да се користи тој со 5-6 атрибути, ќе има многу пишување во прашалниците, индексот ќе биде голем и ред други работи.
     
  17. ChemicalAngel

    ChemicalAngel
    Gaining Experience

    793
    208
    24 ноември 2008
    Муабетот не е надвор од темата, како што гледаш има проблем затоа што не се придржува до ова правило.
    Од примерот, Јазик, името на јазикот може да се смени, а исто и кодот, кај табелата Човек, матичен број важи само во Македонија, но не и во Британија.
     
    На Pulse му/ѝ се допаѓа ова.
  18. kebe

    kebe
    Gaining Experience

    215
    172
    29 Март 2012
    Не е ова правило, никаде не постои правило дека клучот мора да биде вештачки. Во ниедна книга што сум ја читал го нема ова.

    Секогаш може да се смислуваат примери во крајности. Различен контекст различно решение, базата не ми треба за Британија. И кој јазик си го сменал името жити се? Или пак код? Кодовите се намерно правени да служат како интернационални кратенки, а со тоа и клучеви.

    Поентата ми е дека иако вештачки клуч е честа опција, не е задолжителна. Сметај тоа е податок плус, место што зафаќа плус односно пошироки записи, повеќе читања од диск.

    Може да се смислат уште 1000 примери каде едното решение е позгодно и уште 1000 каде другото. Полошо е ако сите 2000 ги префрлиме во иста корпа.
     

Сподели

Вчитување...