sql >> Databáze >  >> RDS >> PostgreSQL

Jak vytvořit tabulku, pouze pokud v PostgreSQL neexistuje

V PostgreSQL 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 žádná jiná tabulka se stejným názvem neexistuje. Pokud tabulka s tímto názvem již existuje, místo chyby se zobrazí „upozornění“.

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 pg_tables zobrazit a zkontrolovat, zda tabulka nyní existuje:

SELECT EXISTS (
    SELECT FROM 
        pg_tables
    WHERE 
        schemaname = 'public' AND 
        tablename  = 't1'
    );

Výsledek:

True

V tomto případě dostávám True , což znamená, že tabulka existuje a že k ní mám přístup.

V závislosti na vaší konfiguraci můžete získat t /f místo True /False .

Zkuste znovu vytvořit tabulku

Pokud se pokusíme vytvořit tuto tabulku znovu:

CREATE TABLE IF NOT EXISTS t1 (
  c1 INT,
  c2 VARCHAR(10)
);

Nezobrazí se nám chyba, ale upozornění:

NOTICE:  relation "t1" already exists, skipping

Jak se dalo očekávat, oznámení 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:  relation "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.

IF NOT EXISTS funkce byla přidána do PostgreSQL 9.1 (poznámky k vydání).


  1. Oracle:'=ANY()' vs. 'IN ()'

  2. Úvod do Java Security API

  3. Funkce hesla MySQL

  4. Několik nápadů o nízkoúrovňovém sdružování zdrojů v PostgreSQL