Diskuze: Kontrola zaznamu pred insertem

Ostatní jazyky SQL SQL a databáze Kontrola zaznamu pred insertem

Avatar
g1ml1
Člen
Avatar
g1ml1:

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.valkovic
Šéfredaktor
Avatar
patrik.valkovic:

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.valkovic
g1ml1:

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.valkovic
Šéfredaktor
Avatar
patrik.valkovic:

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:

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.valkovic
Honza:

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
Redaktor
Avatar
Odpovídá na Honza
Kit:

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.