V MariaDB můžete použít IF NOT EXISTS
klauzule CREATE TABLE
pro kontrolu, zda stejnojmenná tabulka již v databázi existuje, než ji vytvoříte.
Tabulka bude vytvořena pouze v případě, že ještě neexistuje žádná se stejným názvem.
Příklad
Zde je příklad k demonstraci:
CREATE TABLE IF NOT EXISTS t1 (
c1 INT,
c2 VARCHAR(10)
);
Zde t1
je název tabulky a vše v závorkách je definice tabulky (tj. sloupce atd.).
V takovém případě bude tabulka vytvořena pouze v případě, že již neexistuje žádná s názvem t1
.
Zkontrolujte, zda tabulka nyní existuje
Můžeme se dotazovat na information_schema.tables
tabulka a zkontrolujte, zda tabulka nyní existuje:
SELECT EXISTS (
SELECT
TABLE_NAME
FROM
information_schema.tables
WHERE
TABLE_SCHEMA LIKE 'zap' AND
TABLE_TYPE LIKE 'BASE TABLE' AND
TABLE_NAME = 't1'
);
Výsledek:
1
Zde zap
je název databáze a t1
je název tabulky, jejíž existenci ověřuji.
1
znamená, že tabulka existuje. Pokud by neexistoval, dostali bychom 0
.
Zkuste znovu vytvořit tabulku
Nyní, když se pokusíme vytvořit tuto tabulku znovu:
CREATE TABLE IF NOT EXISTS t1 (
c1 INT,
c2 VARCHAR(10)
);
Nedostaneme chybu:
Query OK, 0 rows affected, 1 warning (0.002 sec)
Ale dostáváme varování.
Podívejme se tedy na varování:
SHOW WARNINGS;
Výsledek:
+-------+------+---------------------------+ | Level | Code | Message | +-------+------+---------------------------+ | Note | 1050 | Table 't1' already exists | +-------+------+---------------------------+
Podle očekávání nám říká, že tabulka již existuje.
Bez IF NOT EXISTS
Ustanovení
Co se stane, když nepoužijeme IF NOT EXISTS
klauzule při pokusu o vytvoření tabulky, která již existuje:
CREATE TABLE t1 (
c1 INT,
c2 VARCHAR(10)
);
Tentokrát se zobrazí chyba:
ERROR 1050 (42S01): Table 't1' already exists
Všimněte si, že IF NOT EXISTS
klauzule nekontroluje strukturu/definici tabulky. Jednoduše zkontroluje, že neexistuje žádná existující tabulka se stejným názvem, který se pokoušíme dát tabulce, kterou vytváříme.
Jinými slovy, to, že tabulka s tímto názvem již existuje, neznamená, že má správnou definici.