Table of Contents

HowTo k semestrálce

Transakce - vhodné čtení zvláště pro uživatele MySQL

První rada nad zlato: používejte příkaz COMMIT. Jelikož databáze používá něco, čemu se říká transakce (bude vám vysvětleno na posledních přednáškách), změny aplikované příkazy INSERT, UPDATE apod. nejsou automaticky uloženy, ale jsou k dispozici jen během aktuální relace (pokud se ve stejný čas připojíte jiným klientem, uvidíte původní stav). Změny je nutno “uložit” zavoláním příkazu COMMIT, případně použít stejně pojmenované tlačítko v SqlDeveloperu. Naopak, pomocí příkazu ROLLBACK jste schopni odvolat ještě “necommitované” změny.

Smazaní všech dat z databáze

Protože původní obsah vašeho DB schématu může při ladění semestrálky překážet, nebo prostě chcete začít odznovu, hodí se způsob, jak to udělat rychleji než “po jednom”.

Proveďte nad databází následující dotaz (SQLDeveloper - klávesa F5):

SELECT 'drop table '|| TABLE_NAME ||' cascade constraints;' AS query FROM user_tables
UNION
SELECT 'drop view '|| view_name ||' cascade constraints;' AS query FROM user_views;

Výstupem skriptu bude další skript, a to skript pro smazání všech vašich tabulek a pohledů (tedy i těch z vaší semestrálky). Tento zkopírujte do správného okýnka a skript znovu spusťte (F5). Pro smazání ostatních objektů (které asi ale nepoužíváte) si můžete skript výše modifikovat.

Export dat

Pokud máte data v databázi a nechce se vám pracně psát INSERT skripty, můžete si pomoci exportem z SQLDeveloperu jedním z následujících dvou postupů

  1. Použít příkaz z menu Tools → Export DLL (and Data) se zhruba takovýmto nastavením.
    Kliknutím zvětšíte
  2. Použit příkaz Export → Insert z kontextového menu (pravé tlačítko) nad každou tabulkou a výstupy tohoto příkazu sloučit do jediného skriptu.

Pozor, v obou případech je nutno skupiny INSERT příkazů přeuspořádat do takového pořadí, aby v době, kdy vkládáte nějakou hodnotu, která závisí na nějaké jiné hodnotě z jiné tabulky (cizí klíč), byla ta odkazovaná hodnota již v databázi (vizte příklad).

Dále je nutno na konec skriptu s INSERT příkazy vložit příkaz COMMIT; Také si dejte pozor na bug (viz níže).

Příklad:
OSOBA (ID, JMENO)
PES (ID, JMENO, ID_MAJITEL)
IO: PES[ID_MAJITEL] ⊆ OSOBA[ID]

Je nutno nejprve vložit všechny osoby, a poté psy. Při vkládání psa se totiž kontroluje, zda-li majitel existuje.

Jinou možností je použít tzv. deferred constraints, ale to by vyžadovalo vyšší skills, a mj. úpravy i skriptu pro vytváření tabulek a je to v 99,9% případů zbytečné (anebo byste tam měli hodně špatnou smyčku).

Vkládání datumů

Skript pro vkládání dat by měl jít spustit nezávisle na nastavených locales. Proto je nutné věnovat větší pozornost vkládání údajů typu datum a čas (protože každý národ píše datum jinak, takže se spoléhat na implicitní konverzi ze stringu se nevyplácí). Nejbezpečnější je použít zabudované funkce TO_DATE, která přijme datum ve formátu, jakém si určíte.

Bug v SQLDeveloperu

Upozorňuji, že skripty pro vytvoření databáze a vložení dat musí být funkční (jinak půjdou body dolů). Pokud vám příkaz Export Data → INSERT nad tabulkou v ER modeláři generuje místo čárky jako oddělovač hodnot tečku, pohrajte si s nastavením oddělovačů v nastavení SQLDeveloperu. Jedná se o bug. Hodnoty musí být navzájem různe, resp je nutné s tímto nastavením experimentovat, dokud se nezadaří.

Snímek z funkční verze.

Různé