Jak uložit editovaný záznam pod jiným id?
- .:M@rt!n:.
- Člen | 201
Ahoj,
v aplikaci bych potřeboval udělat abych si mohl hodnoty uložené v db po
vytažení do editačního formuláře uložit pod jiným id. Zkusil jsem
v modelu toto:
return $this->getTable()->insert(array( //insert místo find($id)->update(array(
'id' => $id++
Ale bohužel mě to id nenavýší a po odeslání formuláře s upravenými hodnotami mě laděnka hodí chybu s duplikací hodnot pro stejné id.
Jak tedy editovaná data uložit pod jiným id(o jedno větším)?
Díky za rady
- .:M@rt!n:.
- Člen | 201
Zaměnit $id++ za ++$id pomohlo (id se zvětšilo), ale teď mám problém s cizím klíčem do jiné tabulky ale to už snad vyřeším
- .:M@rt!n:.
- Člen | 201
Jo to on se stará stará v pohodě při vkládání nového záznamu. Ale já potřebuji z editovaného záznamu v db udělat zcela nový záznam a tam si id musím změnit růčo. Původní záznam zůstane nezměněn.
- wb2009
- Člen | 125
Přesně tak jak píše ZZromanZZ
normálně udělej na v té funkci, která pracuje s hodnotami z formuláře insert do databáze, s tím, že dostaneš nějaké jiné nové ID, nebo nám vysvětli proč potřebuješ přesně o jednotku větší? A pokud to potřebuješ, jak řešíš to, že jiný uživatel mezitím co ty budeš přeukládat hodnoty, neinsertně něco nového a nedostane to id o jednotku větší…
nebo jinak, co to duplikovat? Když poprvé vložíš hodnoty, tak se uloží dvakrát? Tedy s id X další záznam ten samý s id X+1?
- Jan Mikeš
- Člen | 771
Proc tak slozite??? Duplikace zasnamu s vynechanim id (o inkrementaci se postara auto_increment atribut):
$oldRow = $this->getTable()->find($id); // Returns Nette\Database\Table\ActiveRow
$oldRowValues = $oldRow->toArray();
unset($oldRowValues["id"]);
$this->getTable()->insert($oldRowValues);
Editoval Lexi (4. 6. 2013 18:27)
- ZZromanZZ
- Člen | 87
O primární klíč (postavený nad unsigned int), by se měl starat SŘBD,
na ten se pak pouze odkazuješ v aplikaci.
MySQL(InnoDB) typicky posouvá o jedna při každém pokusu, i při chybném
vložení při kterém by se porušila integrita.
Proto, se může stát, že nejdou sekvenčně za sebou a vznikne „díra“.
Je to kvůli souběžnému vkládání řádků do db, každý insert si zabere
jednu hodnotu a nemusí na sebe aspoň čekat. Pokud spadne vznikne díra a
další insert má hold hodnotu o jedna vetší. Není to naškodu. Ale to jen
tak naokraj.
Lexiho ukázka je ekvivalentní k tomu co jsem napsal.
.:M@rt!n:., závěr je ten, že si neumím představit, proč bys měl takhle vyplňovat PK v aplikaci.
Editoval ZZromanZZ (4. 6. 2013 19:03)