PostgreSQL cheat sheet

Grundlæggende PostgreSQL til relationsdatabaser

Navngivning

Engelske navne foretrækkes. Uanset sprog bruges ental for entiteter og tabeller: product, ikke products. Brug kun A-Z i tekniske navne. Skriv æ/Æ som ae/AE, ø/Ø som oe/OE og å/Å som aa/AA, for eksempel Børn → Boern og År → Aar.

Vigtige datatyper

  • integer / bigint - heltal
  • numeric(10,2) - præcise tal og beløb
  • text - tekst uden fast længde
  • boolean - TRUE eller FALSE
  • date - kalenderdato
  • timestamp - dato og klokkeslæt
  • jsonb - strukturerede JSON-data
  • bytea - binære data

Opret tabel og id

CREATE TABLE product (
  product_id integer GENERATED ALWAYS AS IDENTITY
    PRIMARY KEY,
  name text NOT NULL,
  price numeric(10,2) NOT NULL,
  inventory integer NOT NULL DEFAULT 0
);

IDENTITY genererer id’er. numeric er velegnet til præcise beløb.

Constraints

  • NOT NULL - værdi er påkrævet
  • UNIQUE - værdien må ikke gentages
  • PRIMARY KEY - entydig identifikation
  • REFERENCES - fremmednøgle
  • CHECK - regel for tilladte værdier
  • DEFAULT - standardværdi
inventory integer NOT NULL
  CHECK (inventory >= 0)

Relationer

CREATE TABLE customer (
  customer_id integer GENERATED ALWAYS AS IDENTITY
    PRIMARY KEY,
  name text NOT NULL,
  email text UNIQUE NOT NULL
);

CREATE TABLE customer_order (
  order_id integer GENERATED ALWAYS AS IDENTITY
    PRIMARY KEY,
  customer_id integer NOT NULL
    REFERENCES customer(customer_id),
  order_date date NOT NULL DEFAULT CURRENT_DATE
);

INSERT - opret data

INSERT INTO product (name, price, inventory)
VALUES ('Tekop', 75.00, 20)
RETURNING product_id;

INSERT INTO product (name, price, inventory)
VALUES
  ('Tallerken', 120.00, 8),
  ('Kande', 250.00, 4);

SELECT - læs data

SELECT product_id, name, price
FROM product
WHERE inventory > 0
ORDER BY price DESC;

SELECT COUNT(*) AS antal
FROM product;

UPDATE - ændr data

UPDATE product
SET inventory = inventory - 1
WHERE product_id = 1
RETURNING *;

Kontrollér altid WHERE-betingelsen først.

DELETE - slet data

DELETE FROM product
WHERE product_id = 1
RETURNING *;

En DELETE uden WHERE sletter alle rækker.

JOIN

SELECT c.name, o.order_id, o.order_date
FROM customer AS c
JOIN customer_order AS o
  ON o.customer_id = c.customer_id;

SELECT o.order_id, p.name, ol.quantity
FROM order_line AS ol
JOIN customer_order AS o
  ON o.order_id = ol.order_id
JOIN product AS p
  ON p.product_id = ol.product_id;

Dato og klokkeslæt

SELECT CURRENT_DATE;
SELECT CURRENT_TIMESTAMP;

SELECT *
FROM customer_order
WHERE order_date >= DATE '2026-01-01';

Brug date og timestamp, når databasen skal kunne validere og beregne med datoer.

Transaktion

BEGIN;
UPDATE product
SET inventory = inventory - 1
WHERE product_id = 1;
COMMIT;

-- Ved problem:
ROLLBACK;

En transaktion samler flere ændringer, så de enten gennemføres samlet eller rulles tilbage.

Husk

  • Brug numeric til præcise beløb.
  • Brug date og timestamp til datoer.
  • Brug fremmednøgler til data-integritet.
  • Brug transaktioner ved sammenhørende ændringer.
  • Test schemaet med realistiske use cases.