Zadejte hledaný výraz...

MySQL – přidání záznamů na ID, které bylo dříve smazáno

franta.hosek
verified
rating uzivatele
9. 11. 2020 10:45:13
Ahoj,
zkouším googlit, ale asi špatně :/ Jak prosím docílím v MySQL toho, že když smažu nějaký záznam, tak se mi na toto místo vloží v budoucnu další záznam. Lze to vůbec, nebo to tento dtb nástroj nedovoluje? Jde mi o to, že provádím ve svém skriptu určitá nastavení a ty potřebuji držet jen 24 hodin. Pak řádky smažu a tabulka nebude mít nikdy několik miliónů záznamů a myslím, že bude pracovat rychleji.
Místo id záznamu na datový typ bigint bych si klidně vystačil s něčím menším (smallint), ale muselo by to jít mazat a pak znovu zapisovat.
Hrál jsem si s auto-increment, ale to asi není ta správná cesta.
Děkuji za rady.
9. 11. 2020 10:45:13
https://webtrh.cz/diskuse/mysql-pridani-zaznamu-na-id-ktere-bylo-drive-smazano/#reply1468315
Pavel Mareš
verified
rating uzivatele
(19 hodnocení)
9. 11. 2020 11:25:12
a kod pro přidávání do DB? protože tam máš 2 cesty
1) DB sama hlídá připočítávání
2) PHP zajišťuje
Oboje musíš mít nějak pohlídané ... ale seš si fakt jistej, že zrovna ID v tabulce chceš řešit? páč můžeš mít ID řádku a ID projektu v tabulce
9. 11. 2020 11:25:12
https://webtrh.cz/diskuse/mysql-pridani-zaznamu-na-id-ktere-bylo-drive-smazano/#reply1468314
franta.hosek
verified
rating uzivatele
9. 11. 2020 11:45:41
Kod do DB, ktery to bude delat manualne, samozrejme dam dohromady. Slo mi o to, jestli to lze vyresit o patro vys - tedy primo v phpmyadminovi.
Myslim to tak, ze pokud budu mit v tabulce radky s id 1-10 a radek 8 smazu, cili tam bude chybet. Ja nasledne udelam v PHP obycejny insert do DB ve kterem nespecifikuji ID, tak mi nyni vlozi radek s id 11 na zaklade auto-increment.
A ja bych rad, aby vlozil zaznam s ID 8, protoze tam je momentalne dira.
DB tabulka je easy, jsou tam jen sloupce: id (bigint), method (char), create_time (timestamp), end (bool).
Ale mozna jsem te nepochopil.
9. 11. 2020 11:45:41
https://webtrh.cz/diskuse/mysql-pridani-zaznamu-na-id-ktere-bylo-drive-smazano/#reply1468313
takatom
verified
rating uzivatele
(2 hodnocení)
9. 11. 2020 12:00:50
Specifikujte ID při insertu.
9. 11. 2020 12:00:50
https://webtrh.cz/diskuse/mysql-pridani-zaznamu-na-id-ktere-bylo-drive-smazano/#reply1468312
David Musil
verified
rating uzivatele
(69 hodnocení)
9. 11. 2020 12:01:58
Napsal takatom;1603644
Specifikujte ID při insertu.
Takže ošetřit při vkládání manuálně mu to půjde, jasně to chápu. A o úroveň výš (phpmyadmin) teda tohle nejde?
9. 11. 2020 12:01:58
https://webtrh.cz/diskuse/mysql-pridani-zaznamu-na-id-ktere-bylo-drive-smazano/#reply1468311
takatom
verified
rating uzivatele
(2 hodnocení)
9. 11. 2020 15:44:37
Phpmyadmin není o úroveň výš - záleží na tvaru příkazu INSERT. Pokud obsahuje hodnotu pro PRIMARY KEY, která je volná, vloží se záznam do DB s touto hodnotou. Pokud volná není, nastane výjimka DUPLICATE KEY.
Pro zapínání/vypínání platnosti parametrů v DB je vhodnější přidat položku STAV a místo vkládání/mazání nastavovat stav aktivní/neaktivní.
9. 11. 2020 15:44:37
https://webtrh.cz/diskuse/mysql-pridani-zaznamu-na-id-ktere-bylo-drive-smazano/#reply1468310
Radim D.
verified
rating uzivatele
(7 hodnocení)
9. 11. 2020 18:27:44
Napsal franta.hosek;1603640
Kod do DB, ktery to bude delat manualne, samozrejme dam dohromady. Slo mi o to, jestli to lze vyresit o patro vys - tedy primo v phpmyadminovi.
Myslim to tak, ze pokud budu mit v tabulce radky s id 1-10 a radek 8 smazu, cili tam bude chybet. Ja nasledne udelam v PHP obycejny insert do DB ve kterem nespecifikuji ID, tak mi nyni vlozi radek s id 11 na zaklade auto-increment.
A ja bych rad, aby vlozil zaznam s ID 8, protoze tam je momentalne dira.
DB tabulka je easy, jsou tam jen sloupce: id (bigint), method (char), create_time (timestamp), end (bool).
Ale mozna jsem te nepochopil.
Pokud opravdu při INSERT z nějakých důvodů nechceš vložit (a tím sám určit) ID, pak se obávám, že nezbývá, než z tabulky načíst seřazené všechny id a hledat první volné místo. Tohle buď udělá nějaká aplikace, tím pádem nemůžeš použít PhpMyAdmin, nebo by mohlo být řešení mít trigger, tím by procházení tabulky zajistilo samotné MySQL.
Ale věřím, že kdyby se někdo, kdo se zabývá optimalizací databází podíval na SELECT přes celou tabulku při každém INSERT, tak se mu vlasy na hlavě zježí hrůzou. :-)
Anebo třeba velmi jednoduše, opravdu musí být DELETE a pak INSERT? Nemůže být třeba UPDATE?
9. 11. 2020 18:27:44
https://webtrh.cz/diskuse/mysql-pridani-zaznamu-na-id-ktere-bylo-drive-smazano/#reply1468309
TomasX
verified
rating uzivatele
(4 hodnocení)
9. 11. 2020 20:52:46
autoincrement vždy roste, neumí doplnit díry v řadě, ale to nevadí, databáze s tím umí pracovat a klidně nech ID růst do bilionů.
Můžeš také vynechat sloupec ID a udělat primary key z jiného, mluvíš o nastavení, to se někdy dělá.
9. 11. 2020 20:52:46
https://webtrh.cz/diskuse/mysql-pridani-zaznamu-na-id-ktere-bylo-drive-smazano/#reply1468308
hm
verified
rating uzivatele
(20 hodnocení)
9. 11. 2020 22:51:02
franta.hosek: Resis zbytecne problem, ktery neexistuje. Rozdil mezi bigint nebo smallint v tvym pripade nepoznas vubec zadnej, zato rozdil mezi insertem s auto incrementem a insertem co bude delat nakou zbytecnou magii, to poznas na 100%. Nevymyslej kolo. Ty databaze jsou na tohle optimalizovany. Absolutne nic neziskas tim ze tam nebudes mit diry.
9. 11. 2020 22:51:02
https://webtrh.cz/diskuse/mysql-pridani-zaznamu-na-id-ktere-bylo-drive-smazano/#reply1468307
crs
verified
rating uzivatele
(1 hodnocení)
16. 11. 2020 04:17:54
Pokud jde jen o estetiku a hezký pocit, že v tabulce v ID nemáš "díry", tak to opravdu pusť z hlavy.
(O sloupec s "auto increment" se stará databázový stroj, pro tabulku si udržuje jen jednu hodnotu pro "příští vložené ID". Tabulka může být teoreticky libovolně promazaná, např. na milion záznamů mít půl milionu děr v posloupnosti pro id, snaha "zaplňovat díry" při vkládání by vyústila ve dvakrát pomalejší výkon, a to nechceš.)
A navíc, řekněme z pragmatického hlediska, by to tak mělo být (tedy již použité ID by se nemělo opakovat) - třeba pro daný (smazaný) řádek ještě existují nějaké resources, které jsou ještě v cache nebo ještě nebyly smazány garbage collectorem nebo nějakým synchronizačním nástrojem apod. To si do budoucna jen koleduješ o problém.
Pokud potřebuješ v konkrétní tabulce udržovat spojitou posloupnost (tedy na úrovni databázové aplikace), pak je to úplně jiná úloha.
16. 11. 2020 04:17:54
https://webtrh.cz/diskuse/mysql-pridani-zaznamu-na-id-ktere-bylo-drive-smazano/#reply1468306
Pro odpověď se přihlašte.
Přihlásit