IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
g1ml1
Člen
Avatar
g1ml1:6.11.2013 16:40

Zdravim,

chtel bych prodiskutovat jak nejefektivneji zkontrolovat existenci stejneho zaznamu pred samotnym vlozenim do tabulky.
Chci zabranit zbytecne redundanci, jak na to?
Co treba slozeny index na vsechny atributy?
Nebo slozene UNIQUE na vsechny atributy (krome id)? Byl bych pak schopny efektivne ziskat Id toho existujici zaznamu, v pripade, ze by existoval.

 
Odpovědět
6.11.2013 16:40
Avatar
Patrik Valkovič:6.11.2013 17:21

Můžeš použít normální insert, potom ON DUPLICATE KEY UPDATE, kde bys dal nějakou nemožnou podmínku (WHERE ID=-1), ale je to zase založené na UNIQUE hodnotách.
Jinak jak si uvedl, pokud nechceš mít dva stejné záznamy, použiješ UNIQUE na sloupec, který má být pokaždé jiný.
Přes PHP se potom zeptáš mysqli->affected_rows a pokud se to bude rovnat nule tak se vložení nepovedlo.

Nahoru Odpovědět
6.11.2013 17:21
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
g1ml1
Člen
Avatar
Odpovídá na Patrik Valkovič
g1ml1:6.11.2013 17:44

Ok diky, koukal jsem na to

ON DUPLICATE KEY

a v MySql to maji pekne resene, ja pouzivam MSSql db, takze jdu hledat jejich reseni.

 
Nahoru Odpovědět
6.11.2013 17:44
Avatar
Patrik Valkovič:6.11.2013 18:35

v MS SQL by mělo jít

if not exists (select * from table where cell = 1)
   insert into table(x,y) values (a,b);

ale nevím to 100%

Nahoru Odpovědět
6.11.2013 18:35
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
hanspunk
Člen
Avatar
hanspunk:7.11.2013 15:47

V MS SQL by mělo fungovat do definice tabulky:

...
CONSTRAINT jmeno_omezeni UNIQUE NONCLUSTERED
(sloupec1, sloupec2, ... sloupecn)
...

Samozřejmě s uvedením všech sloupců, které se nemají vyskytovat ve stejné kombinaci vícekrát. Ale zatím jsem to nepotřeboval, a tedy nezkoušel. Pokud to nepůjde, jistě to půjde BI triggerem ;-)

Nahoru Odpovědět
7.11.2013 15:47
WHILE @@FETCH_STATUS = 0 FETCH NEXT pivo FROM sud INTO @hanspunk
Avatar
Honza
Člen
Avatar
Odpovídá na Patrik Valkovič
Honza:31.12.2013 9:49

To patrik.valkovic :

Vím že se to používá, ale nemůže nastat teoretický případ kdy více uživatelů zavolá ten if, u všech to projde protože záznam tam ještě není a tím vzniknou v DB duplicity?

Editováno 31.12.2013 9:50
Nahoru Odpovědět
31.12.2013 9:49
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Honza
Kit:31.12.2013 10:25

Podívej se, jestli to MSSQL dělá jako transakci. Pokud ne, uzavři to do transakce.

Nahoru Odpovědět
31.12.2013 10:25
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.