CREATE DATABASE / DROP DATABASE în PostgreSQL

Tabele, scheme și tipuri (DDL) PostgreSQL 8.0+ (DROP DATABASE ... WITH (FORCE): 13+, ICU_LOCALE: 15+)

Creează sau șterge o bază de date pe serverul PostgreSQL. O bază de date conține scheme, tabele și utilizatorii ei au drepturi separate.

Sintaxă SQL
CREATE DATABASE nume
    [OWNER rol] [ENCODING 'UTF8'] [TEMPLATE template0]
    [LOCALE_PROVIDER icu] [ICU_LOCALE 'ro-RO'];

DROP DATABASE [IF EXISTS] nume [WITH (FORCE)];

Ce face CREATE DATABASE / DROP DATABASE

Un server PostgreSQL (un „cluster”) poate avea mai multe baze de date. Fiecare conexiune lucrează într-o singură bază de date; nu poți face JOIN direct între tabele din baze de date diferite.

CREATE DATABASE copiază baza de date șablon template1. Dacă vrei altă codare sau altă regiune (ordinea alfabetică, de exemplu cu diacritice românești), folosește TEMPLATE template0. Comanda nu poate rula într-o tranzacție (BEGIN).

DROP DATABASE șterge definitiv baza de date. Nu merge cât timp există conexiuni la ea; din PostgreSQL 13, WITH (FORCE) le închide. Din linia de comandă există echivalentele createdb și dropdb.

Parametri

Parametru Descriere
OWNER rol Proprietarul bazei de date (implicit: utilizatorul care o creează).
ENCODING Codarea caracterelor; folosește 'UTF8'.
TEMPLATE template0 Șablon curat, necesar când schimbi codarea sau regiunea.
LOCALE_PROVIDER icu, ICU_LOCALE Ordonare după regulile ICU, de exemplu 'ro-RO'.
WITH (FORCE) La DROP DATABASE: închide conexiunile active.

Ce returnează

Mesajul CREATE DATABASE, respectiv DROP DATABASE.

Exemple

Exemplul 1: Bază de date pentru un magazin online

CREATE DATABASE magazin
    OWNER ana
    ENCODING 'UTF8'
    TEMPLATE template0
    LOCALE_PROVIDER icu
    ICU_LOCALE 'ro-RO';

\c magazin

Rezultat în psql

CREATE DATABASE
You are now connected to database "magazin" as user "postgres".

Exemplul 2: Ștergere cu conexiuni active

DROP DATABASE magazin_test;
DROP DATABASE magazin_test WITH (FORCE);

Rezultat în psql

ERROR:  database "magazin_test" is being accessed by other users
DETAIL:  There is 1 other session using the database.
DROP DATABASE

Exemplul 3: Lista bazelor de date

SELECT datname, pg_encoding_to_char(encoding) AS codare
FROM pg_database
WHERE NOT datistemplate
ORDER BY datname;

Rezultat în psql

 datname  | codare 
----------+--------
 magazin  | UTF8
 postgres | UTF8
(2 rows)

Greșeli frecvente

  • Rulezi CREATE DATABASE într-un BEGIN ... COMMIT sau dintr-un instrument care deschide tranzacții automat: primești CREATE DATABASE cannot run inside a transaction block.
  • Încerci să ștergi baza de date în care ești conectat. Conectează-te la alta (de exemplu postgres) și rulează de acolo.

Comenzi înrudite

  • CREATE SCHEMA și search_path: O schemă este un dosar de tabele în interiorul unei baze de date. search_path stabilește în ce scheme caută PostgreSQL numele fără prefix.
  • CREATE ROLE / CREATE USER: Creează un rol: un utilizator care se poate conecta (LOGIN) sau un grup de drepturi atribuit altor roluri.