Pondělí květen 23, 2011
INSERT a následný dotaz SELECT LAST_INSERT_ID()
· rubrika Blog · kategorie MySQL
Pokud vložíte do databáze nový záznam a pak provedete dotaz SELECT LAST_INSERT_ID() dostanete ID posledního vloženého záznamu (v tabulce musí být sloupec s autoinkrementem). V případě, že už v databázi záznam existuje MySQL vyhodí chybu a ID již existujícícho záznamu nezjistíme. Můžeme ovšem použít INSERT s konstrukcí ON DUPLICATE KEY UPDATE. Tato varianta pak po použití SELECT LAST_INSERT_ID() vždy vrátí ID, buď již existujícího záznamu a nebo i nově vloženého.
10:34
—
Komentář
—
Stálý odkaz
Úterý duben 19, 2011
Počet ovlivněných řádků a ON DUPLICATE KEY UPDATE
· rubrika Blog · kategorie Databáze
Pokud v MySQL použijete ON DUPLICATE KEY UPDATE konstrukci, pak vrácený počet ovlivněných řádků je závislý na tom, zda došlo ke vložení nového záznamu a nebo jen k updatování stávajícího. Pokud dojde k vložení nového záznamu, pak je počet ovlivněných řádků roven jedné. V případě updatování záznamu bude počet ovlivněných řádků roven dvěma a né jedné, jak by mnozí čekali.
08:25
—
Komentář
—
Stálý odkaz
Pátek květen 15, 2009
SQL - stručný popis a standardy
· rubrika Clanky · kategorie Databáze
SQL je neprocedurální jazyk, nepopisuje jak pracovat s databází, ale co od ní uživatel potřebuje. Skládá se z několika částí:
- DDL (Data Definition Language) – jazyk pro definici struktury databáze
- CREATE – vytváření nových objektů.
- ALTER – změny existujících objektů.
- DROP – odstraňování objektů.
- DML (Data Manipulation Language) – jazyk pro manipulaci s daty
- SELECT – vybírá data z databáze, umožňuje výběr podmnožiny a řazení dat
- INSERT – vkládá do databáze nová data
- UPDATE – mění data v databázi (editace)
- MERGE – záznam se do tabulky vloží, pokud v tabulce neexistuje odpovídající klíč, nebo se záznam upraví
- DELETE – odstraňuje data (záznamy) z databáze
- SHOW – příkaz pro zobrazení databáze, tabulek nebo záznamů
- DCL (Data Control Language) – jazyk pro řízení transakcí a nastavování přístupových práv
- GRANT – příkaz pro přidělení práv uživateli k určitým objektům
- REVOKE – příkaz pro odejmutí práv uživateli
- BEGIN – zahájení transakce
- COMMIT – potvrzení transakce (úspěšné provedení)
- ROLLBACK – zrušení transakce a návrat do původního stavu
Jazyk SQL má v současné době šest verzí standardu, které jsou vždy označovány dle roku vzniku:
- SQL-89 – první specifikace standardu
- SQL-92 – přinesl modifikace SQL schémat, zavedení tabulek s metadaty , vnějších spojení, kaskádního mazání/aktualizace podle cizích klíčů, množinové operace, transakce, kurzory, výjimky, …
- SQL-99 – rozšíření o regulární výrazy, rekurzivní dotazy, triggery, neskalární typy, objektové vlastnosti, …
- SQL:2003 – přináší XML rozšíření, standardizované sekvence a sloupce s automaticky generovanými hodnotami, odstranění datového typu BIT
- SQL:2006 – definuje způsoby, jak importovat a ukládat XML data v databázích jak s nimi manipulovat uvnitř databáze a také jak publikovat data z databáze do XML formátu
- SQL:2008 – upravuje některá předchozí rozšíření
V dnešní době je většina DBMS založena na standardu SQL-92 a SQL-99
(existují však rozdíly v implementaci ). Implementace významných částí
standardů SQL-2006 a 2008 je pouze u některých produktů (například
Oracle). Bohužel informace o tom, co která databáze ze standardů podporuje,
jsou na internetu velmi špatně dostupné.
Celkový problém SQL spočívá v tom, že každá databáze do něj
přidává své vlastní prvky. Většina databází navíc implementuje pouze
části standardů, většinou dle aktuálních potřeb uživatelů (nebo
obecně trhu), a tak je přenositelnost aplikací složitější. Jako příklad
lze uvést vkládání více řádků pomocí jednoho INSERT dotazu. Dle
standardu by podoba takového dotazu vypadala následovně :
INSERT INTO tabulka VALUES (0,'Petr'), (1,'Pavel'), (2,'Mirek');
Ovšem podpora ze strany databází je různá:
| Databáze | MySQL 5 | PostgreSQL 8.3 | Firebird 2.1 | Oracle 11g | MSSQL 2008 |
|---|---|---|---|---|---|
| Podpora | ano | ano | ne | ne | ne |
09:24
—
Komentář
—
Stálý odkaz
Pondělí duben 27, 2009
Datový typ boolean v databázích
· rubrika Clanky · kategorie Databáze
Datový typ boolean (nebo jen bool) nabívá hodnot TRUE nebo FALSE. Jedná se o jeden ze základních datových typů, přesto by jste ho ve většině databází hledali marně. Například Oracle, MySQL, MSSQL, Firebird a DB2 ho nemají. Opakem je PostgreSQL, který je ovšem v oblasti datových typů známý svou pestrou nabídkou. Proč tedy není v mnoha databázích dostupný? Je to dáno nejspíše tím, že ve standardu SQL se píše, že implementace datového typu bool je volitelná. Jeho absence ovšem není nikterak velkým problémem, nasimulovat ho lze pomocí ostatních dostupných typů. Existují čtyři možnosti:
- char(1)
- tinyint(1)
- bit
- smallint
Obecně by se dal použít jakkýkoliv číselný nebo znakový typ, ale samozřejmě je důležité aby nezabírali zbytečně mnoho místa.
11:43
—
Komentář
—
Stálý odkaz
Středa duben 22, 2009
Rozdíly v implementaci SQL jazyka
· rubrika Clanky · kategorie Databáze
Ti zvás, kteří již měli možnost pracovat s více databázovými
systémy (DBMS), zajisté o této problematice vědí své. I když je SQL
standardizován (existuje 6 verzí SQL-89, SQL-92, SQL-99, SQL:2003, SQL:2006 a
SQL:2008), tak většina DBMS implementuje jen některé části. Mnohdy je
k tomu vedou požadavky uživatelů nebo trhu obecně. V dnešní době je
navíc většina DBMS založena na standardu SQL-92 a implementace
významnějších částí standardů SQL-99 a SQL-2003 je k nalezení pouze
u některých produktů. Poslední standardy SQL:2006 a SQL:2008 jsou na tom
s jejich podporou momentálně nejhůře.
Zhlediska rozdílů v implementaci SQL jazyka v databázích jsem narazil na
zajímavou stránku,
kde se srovnává MySQL, MSSQL, Oracle, PostgreSQL, DB2 a Informix. Věřím,
že některým z vás tato stránka pomůže
20:23
—
Komentář
—
Stálý odkaz
Úterý duben 21, 2009
Optimalizace pro import velkého nmnožství dat do databáze
· rubrika Clanky · kategorie Databáze
Optimalizace se týkají vkládání (importu) většího počtu dat, které bude rychlejší a omezí se případné chyby, které by mohly nastat (typicky závislost mezi primárním a cizím klíčem). Obecně se jedná o následující kroky, které se provedou před vkládáním dat:
- odstranění primárních, cizích klíčů
- deaktivování (odstranění) indexů
- deaktivování (odstranění) trigerrů
- při použití transakcí vypnout tzv. autocommit (mód, kdy je okamžitě každý SQL příkaz implicitně potvrzen jako commit)
- zvýšení pracovní paměti na databázovém serveru
Po úspěšném vložení dat dojde ke znovu vytvoření primárních a
cizích klíčů, aktivování nebo vytvoření indexů a triggerů a
k upravení pracovní paměti na databázovém serveru, pokud byla předtím
hodnota změněna.
Samozřejmě existují optimalizace pro konkrétní typy databází. Například
v PostgreSQL příkaz VACUUM a
v MySQL OPTIMIZE
TABLE, které by se měly používat pokud v tabulce dochází k častým
změnám řádků.
14:04
—
Komentář
—
Stálý odkaz
Sobota duben 11, 2009
"Unbuffered" dotazy
· rubrika Clanky · kategorie PHP
Možná víte, možná nevíte, ale pokud programujete v PHP a položíte
nějaký dotaz na databázi, který vrací výsledky, pomocí klasických
funkcí mysql_query, pg_query atd., tak PHP čeká na všechny
data od databáze, ty si uloží v paměti a teprve následně pak s nima
může programátor pracovat. Při malém množství vrácených záznamů nám
toto vadit nebude, ale co když budeme například exportovat tabulku
s milióny záznamů? Brzo by došla pamět procesu (ne paměť přidělená
PHP skriptu).
Toto by se dalo vyřešit dvěma způsoby:
- – Prvním dotazem si zjistit kolik nám bude vráceno záznamů a pak
v cyklu číst vždy pouhých xxx záznamů, ty následně zpracovat
(samozřejmě také uvolnit použité zdroje
) a pak dalším dotazem si
říct o další, dokud je nepřečteme všechny. - – Použít tzv. „unbuffered“ dotazy, kdy se žádná data nikde neukládají, pomocí funkcí mysql_unbuffered_query, …
Druhý zmiňovaný způsob lze ovšem použít pouze pro databáze MySQL, SQLite a Sybase a má několik nevýhod:
- nelze zjistit počet vrácených záznamů
- tabulka zůstane blokována, dokud se nepřečtou všechny záznamy
- lze pracovat jen s posledním položeným dotazem
A co se děje když položíme dotaz na MySQL pomocí funkce
mysql_unbuffered_query()? Nedalo mne to a prozkoumal jsem si zdrojové kódy
PHP, kde jsem zjistil že se volá funkce
mysql_use_result()
v případě unbuffered dotazů
jinak při normálních dotazech funkce „mysql_store_result()“: http://dev.mysql.com/…-result.html
(funkce jsou z MySQL API pro C).
Rozdíl je v tom, že při volání mysql_use_result() si databáze alokuje
paměť nutnou pro přečtení jednoho záznamu a
ten pošle klientovi a po zavolání funkce mysql_fetch_row() (opět MySQL API
pro C) databáze přečte další řádek a ten pošle klientovi atd. dokud se
nepřečtou všechny záznamy. V opačném případě se čte více dat a jak
jsem již psal PHP si nejdříve vše uloží do paměti a pak stím umožní
pracovat
13:54
—
Komentář
—
Stálý odkaz
Čtvrtek duben 2, 2009
Uvozování identifikátorů v SQL dotazech
· rubrika Clanky · kategorie Databáze
Co je identifikátor snad nemusím vysvětlovatINSERT INTO set (cislo1, cislo2, cislo3) VALUES (0,1,0);MySQL nám vyhodí chybu, jelikož slovíčko set je příkaz (př. SET NAMES utf-8 ) a neočekávalo ho na tomto místě
You have an error in your SQL syntax; check the manual thatZkusme nyní názvy identifikátorů napsat takto:
corresponds to your MySQL server version for the right syntax to
use near 'set
`nazev_identifikatoru`Na databázi pak položíme upravený dotaz:
INSERT INTO `set` (`cislo1`, `cislo2`, `cislo3`) VALUES (0,1,0);Nyní se data úspěšně vloží do databáze, která díky ` zjistí, že bude následovat název identifikátoru. V každé databázi je to však jinak, např. v PostgreSQL se používají dvojté uvozovky ".
18:56
—
Komentář
—
Stálý odkaz
Středa březen 4, 2009
Získání dat z meta informací databází (informační schémata)
· rubrika Clanky · kategorie Databáze
Včera jsem se snažil najít informace o tom, jak získat seznam tabulek pro určitou databázi v PostgreSQL . V MySQL lze použít příkaz:
SHOW FULL TABLES FROM databaze WHERE table_type = „BASE TABLE“
Chceme-li přesněji definovat jaké tabulky chceme získat:
SHOW FULL TABLES FROM databaze WHERE table_type = „BASE TABLE“
LIKE „prefix_%“
Hledal jsem proto nějakou alternativu k MySQL příkazu SHOW FULL
TABLES pro PostgreSQl a narazil jsem přitom na stránky člověka Lorenzo Alberton .
Ten na svých stránkách uveřejnil několik tutoriálů
(v anglickém jazyce), kde píše jak získat data z metainformací
databází PostgreSQL , Firebird/Interbase
, Oracle , SQL Server .
V jeho tutoriálech tak můžeme najít nejenom jak získat seznam tabulek,
ale i pohledů, indexů, klíčů atd. Tyto informace mohou být pro mnoho
lidí cenné, proto se tímto chci s váma poddělit o výše uvedené
odkazy
09:55
—
Komentář
—
Stálý odkaz