Autor Zpráva
Waclav Wronski
Profil *
Úvodem se přiznávám že jsem začátečník a potřeboval bych poradit jak zkrátit zápis pro kopírování celého řádku mezi dvěma tabulkami.

Obě tabulky mají zcela totožnou strukturu...

Nyní to dělám zřejmě složitě přes SELECT * FROM temp_tabulka where id=1 a pak normální

INSERT INTO norm_tabulka (id, nazev, autor, ...) VALUES (NULL,'nějaký název','nějaký autor', ...);

Neexistuje nějaká úspornější varianta bez nutnosti vypisování těch položek ve values - INSERT INTO?

Jde mi jen o to zkopírovat podle daného ID celý řádek se všemi položkami z temp tabulky do identické tabulky "veřejné" ...
juriad
Profil
INSERT INTO norm_tabulka SELECT * FROM temp_tabulka WHERE id = 1

Otázkou je, proč vůbec máš dvě tabulky a ne jednu s jedním sloupcem navíc, který určuje, zda je záznam veřejný nebo nikoliv.
Waclav Wronski
Profil *
juriad:
Je fakt že jsem to nedomyslel... já bych totiž potřeboval aby při překopírování do té veřejné tabulky řádek získal nové ID (podle auto_increment v norm_tabulka). Ostatní data z řádku zůstanou identická, jde tento požadavek napasovat do tvého jinak sympatického příkazu?

Záměr je takový že v Temp zůstávají nevystavené "rozpracované" příspěvky, a teprve až když jsou definitivně připravené k vystavení (mazané už nikdy nebudou) je přenáším do veřejné tabulky kde bych potřeboval posloupnou řadu ID-ček bez "prázdných ID", proto to rozhazuji do dvou TAB. Je to jen můj laický přístup :-)
Dan Charousek
Profil
Waclav Wronski:
Jak psal juriad v [#2]. Přidej do původní tabulky nový sloupec, který bude určovat zda je příspěvek publikovaný nebo rozpracovaný. Můžeš použít sloupec typu enum, který se pro tyhle účely hodí.
Waclav Wronski
Profil *
....jak už jsem výše vysvětlil já tam ale nemůžu mít "slepá ID" a proto ten sloupeček navíc to nevyřeší, doufám že nedostanu odpověd: "a proč tam nechceš "prázdná ID" ---- prostě to tak mám navržené a zbytek aplikace to vyžaduje a celé to překopávat již nebudu.... díky.
mimochodec
Profil
Waclav Wronski:
prostě to tak mám navržené a zbytek aplikace to vyžaduje a celé to překopávat již nebudu

Takže "mám to tak navržené, přidat sloupec a WHERE rozpracovano=1 je nemožné, místo toho udělám druhou tabulku a do ní budu kopírovat řádky". Jdeš sice horší cestou, ale zase je to dál.
juriad
Profil
Je to možné: sqlfiddle.com/#!9/bf7ef/2
Nepoužiješ v selectu *, ale vyjmenuješ všechny sloupce kromě ID a to samé uděláš v tom insertu.
Waclav Wronski
Profil *
mimochodec:
Nějak nechápu co je špatného na systému tabulka_rozpracovane vers. tabulka_hotove

Nad tabulkou "hotove" která nebude tak objemná se jistě bude rychleji vyhledávat a pracovat s ní pro výstupy než s tabulkou třeba i dvakrát objemnější obsahující rozpracovaná data, která v dobu výběru nejsou potřebná...

juriad:
díky mrknu nato ;-)
juriad
Profil
Waclav Wronski:
Špatně je to, že premýšlíš o rychlosti. Když budeš mít správné indexy, tak nebude vadit, že tabulka obsahuje milion záznamů. Navíc přesouváš toto do logiky aplikace. Na většině míst pak musíš mít podmínky na to, z které tabulky se mají data zobrazit a přepínat mezi nimi. Musíš řešit kopírování záznamů, pak pokud máš na záznamy něco navázaného, musíš kopírovat i tyto další záznamy, musíš synchronizovat jejich ID, aby na sebe pasovala. Je to celkově mnohem křehčí než to udělat správně.
Keeehi
Profil
Waclav Wronski:
Samozřejmě nejlepší řešení je to přepracovat tak, aby aplikace nebyla závislá na posloupnosti IDček bez mezer*. Je tu však jedno řešení tak napůl cesty. Záznamy mají idčka, ale ty se ven nepoužívají. Přidáš sloupec public_ID, kde budeš mít tu posloupnost bez mezer u publikovaných řádků a u ostatních null. ID a public_ID si samozřejmě odpovídat nemusí. ID použiješ, když chceš třeba záznam editovat nebo smazat, public_ID použiješ tam, kde pravuješ s tou posloupností IDček.

* jak to děláš, když máš 5 záznamů a porřebuješ druhý smazat? To to pak všechno přečíslováváš? A co se stane, když někdo zrovna va chvíli přečíslovávání pošle požadavek na zobrzení?
midlan
Profil
Souhlas s Keeehi. V aplikaci je téměř určitě něco špatně navrženo, když se nesmí objevit "díra" mezi identifikátory. Jediný příklad z praxe kde se toto nesmí stát, mě napadají jen čísla faktur. Tam to ale nebude vadit (správně navržené) aplikaci, ale jen finančnímu úřadu.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: