Autor | Zpráva | ||
---|---|---|---|
Waclav Wronski Profil * |
#1 · Zasláno: 14. 1. 2016, 10:20:31
Ú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 * |
#3 · Zasláno: 14. 1. 2016, 11:45:25
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 |
#4 · Zasláno: 14. 1. 2016, 11:48:34
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 * |
#5 · Zasláno: 14. 1. 2016, 11:53:33
....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 |
#6 · Zasláno: 14. 1. 2016, 11:59:28
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 |
#7 · Zasláno: 14. 1. 2016, 11:59:31
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 * |
#8 · Zasláno: 14. 1. 2016, 12:09:18
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 |
#9 · Zasláno: 14. 1. 2016, 12:21:46
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 |
#10 · Zasláno: 14. 1. 2016, 12:32:28
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 |
#11 · Zasláno: 15. 1. 2016, 13:13:12
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.
|
||
Časová prodleva: 9 let
|
0