PostgreSQL-Dokumentation
Regeln aus der PostgreSQL-18-Dokumentation, die ein Modell wahrscheinlich falsch macht: überraschende Voreinstellungen, Sperr- und Nebenläufigkeitsfallen, PostgreSQL-18-Änderungen und die von der Dokumentation empfohlenen Muster. Jede Regel endet mit der URL der Dokumentation, die sie belegt.
Abgedeckte Version
Die Referenzen folgen der PostgreSQL-18-Dokumentation (Minor Release 18.6). Fakten, die erst ab Version 18 gelten, sagen explizit "PostgreSQL 18". Überprüfen Sie zuerst die Serverversion. Bei einem älteren Server behandeln Sie jede Regel mit "PostgreSQL 18" als nicht verfügbar.
Navigation
Lesen Sie nur die Referenz, die die Aufgabe benötigt, aus der folgenden Tabelle. Quellen: SOURCES.md.
Kurzregeln
- In PostgreSQL 18 ist eine generierte Spalte ohne Schlüsselwort VIRTUAL (beim Lesen berechnet). Schreiben Sie
STOREDfür Statistiken oder logische Replikation. https://www.postgresql.org/docs/18/ddl-generated-columns.html https://www.postgresql.org/docs/18/sql-altertable.html - Verwenden Sie Identitätsspalten, nicht
serial. Eine Identitätsspalte ist NOT NULL, aber nicht eindeutig: Fügen Sie PRIMARY KEY hinzu. https://www.postgresql.org/docs/18/ddl-identity-columns.html - Indizieren Sie die referenzierenden Spalten jedes Fremdschlüssels selbst. PostgreSQL indiziert nur die referenzierte Seite. https://www.postgresql.org/docs/18/ddl-constraints.html
- Ein einfaches
CREATE INDEXblockiert Schreibvorgänge während des gesamten Aufbaus. Verwenden Sie bei Live-TabellenCREATE INDEX CONCURRENTLYaußerhalb eines Transaktionsblocks und löschen Sie den INVALID-Index, den es bei einem Fehler hinterlässt. https://www.postgresql.org/docs/18/sql-createindex.html - Fügen Sie Constraints zu großen Tabellen als
NOT VALIDhinzu, dannVALIDATE CONSTRAINT, was keine Schreibvorgänge blockiert. PostgreSQL 18 akzeptiert dies auch für NOT NULL. https://www.postgresql.org/docs/18/sql-altertable.html ADD COLUMNmit einer volatilen Voreinstellung, einer gespeicherten generierten Spalte oder einer Identität schreibt die gesamte Tabelle unter ACCESS EXCLUSIVE neu. Eine nicht-volatile Voreinstellung tut dies nicht. https://www.postgresql.org/docs/18/sql-altertable.html- Setzen Sie
lock_timeoutin Migrationssitzungen undstatement_timeout,lock_timeoutundtransaction_timeoutpro Rolle oder Sitzung, niemals global. https://www.postgresql.org/docs/18/runtime-config-client.html - Upsert mit
INSERT ... ON CONFLICT (cols) DO UPDATE, das im READ COMMITTED-Modus bei Nebenläufigkeit immer einfügt oder aktualisiert. MERGE kann mit einer Unique-Verletzung fehlschlagen, wenn eine andere Sitzung denselben Schlüssel einfügt. https://www.postgresql.org/docs/18/transaction-iso.html - Wiederholen Sie die gesamte Transaktion bei SQLSTATE 40001 und 40P01. PostgreSQL wiederholt nie von selbst. Testen Sie den SQLSTATE, nicht die Nachricht. https://www.postgresql.org/docs/18/mvcc-serialization-failure-handling.html
- Die Standardisolierung ist READ COMMITTED: Jede Anweisung sieht einen neuen Snapshot. Geschäftsregeln mit mehreren Zeilen benötigen SERIALIZABLE oder explizite Sperren. https://www.postgresql.org/docs/18/transaction-iso.html https://www.postgresql.org/docs/18/applevel-consistency.html
- Verwenden Sie für Job-Warteschlangen
SELECT ... FOR UPDATE SKIP LOCKEDundFOR NO KEY UPDATE, wenn Schlüssel unverändert bleiben. https://www.postgresql.org/docs/18/sql-select.html https://www.postgresql.org/docs/18/explicit-locking.html NOT INmit einem NULL in der Liste oder Unterabfrage ist niemals wahr. Aggregate außercountgeben NULL über null Zeilen zurück. https://www.postgresql.org/docs/18/functions-comparisons.html https://www.postgresql.org/docs/18/functions-aggregate.html- Paginierung und
LIMITbenötigen ein ORDER BY auf einem eindeutigen Schlüssel, da sich sonst die Ergebnisse zwischen den Ausführungen unterscheiden. https://www.postgresql.org/docs/18/queries-limit.html - Speichern Sie Zeitpunkte als
timestamptz.TIMESTAMP '2004-10-19 10:23:54+02'ist ein Zeitstempel ohne Zeitzone und der Offset wird verworfen. https://www.postgresql.org/docs/18/datatype-datetime.html now()ist die Startzeit der Transaktion. Verwenden Sieclock_timestamp()für die Echtzeit. Verwenden Sie niemals die Zeichenkette'now'als Voreinstellung. https://www.postgresql.org/docs/18/functions-datetime.html- Verwenden Sie
jsonb, indiziert mitGIN (col jsonb_path_ops)für@>-Abfragen. Der Operator muss auf den indizierten Ausdruck angewendet werden, damit der Index verwendet wird. https://www.postgresql.org/docs/18/datatype-json.html - PostgreSQL 18 fügt
uuidv7()hinzu, eine zeitlich geordnete UUID, nebengen_random_uuid(). https://www.postgresql.org/docs/18/functions-uuid.html - In PostgreSQL 18 liest
RETURNINGold.colundnew.colin INSERT, UPDATE, DELETE und MERGE. https://www.postgresql.org/docs/18/dml-returning.html EXPLAIN ANALYZEführt die Anweisung aus: Umschließen Sie Schreibvorgänge mitBEGIN ... ROLLBACK. In PostgreSQL 18 enthält es BUFFERS automatisch. https://www.postgresql.org/docs/18/sql-explain.html https://www.postgresql.org/docs/18/using-explain.html- Ein mehrspaltiger B-Baum kann in PostgreSQL 18 eine Abfrage ohne seine führende Spalte bedienen (Skip Scan), aber nur, wenn diese Spalte wenige unterschiedliche Werte hat. https://www.postgresql.org/docs/18/indexes-multicolumn.html
- Lassen Sie Autovacuum eingeschaltet und vermeiden Sie VACUUM FULL. Autovacuum analysiert niemals partitionierte Tabellen oder temporäre Tabellen: Analysieren Sie diese selbst. https://www.postgresql.org/docs/18/routine-vacuuming.html
- Zeilenbasierte Sicherheit bewirkt nichts, bis
ENABLE ROW LEVEL SECURITYgesetzt ist, und Tabellenbesitzer umgehen sie, es sei denn,FORCE ROW LEVEL SECURITYist gesetzt. https://www.postgresql.org/docs/18/ddl-rowsecurity.html - Eine SECURITY DEFINER-Funktion benötigt
SET search_path = trusted_schema, pg_tempund EXECUTE widerrufen von PUBLIC in derselben Transaktion. https://www.postgresql.org/docs/18/sql-createfunction.html - Die Gewährung einer Tabelle erstreckt sich nicht auf die von ihr verwendeten Sequenzen, einschließlich derer von
serial-Spalten. Setzen Sie Sequenzberechtigungen separat. https://www.postgresql.org/docs/18/sql-grant.html - Clients standardmäßig auf
sslmode=prefer, was den Server nicht überprüft. Verwenden Siesslmode=verify-full. https://www.postgresql.org/docs/18/libpq-ssl.html - Bauen Sie dynamisches SQL mit
format('%I', ident)undEXECUTE ... USINGfür Werte, niemals durch Verkettung. https://www.postgresql.org/docs/18/plpgsql-statements.html - Volltext-Ausdrucksindizes müssen das 2-Argument-
to_tsvector('english', col)verwenden, und Abfragen müssen diese exakte Form wiederholen. https://www.postgresql.org/docs/18/textsearch-tables.html
Referenzen
| Referenz | Lesen Sie sie, wenn ... |
|---|---|
| schema-design.md | Sie Tabellen erstellen: Identität und Sequenzen, generierte Spalten, Constraints, temporäre Schlüssel, Domänen, Schemas und search_path, Partitionsdesign |
| migrations-and-locks.md | Sie eine Migration schreiben: ALTER TABLE-Sperrstufen und -Neuschreibungen, NOT VALID, parallele Indexerstellung, REINDEX, Partition anhängen und lösen |
| data-types.md | Sie numerische, Text-, Bytea-, Enum-, UUID-, Array- oder Bereichstypen wählen, Ausschluss-Constraints auf Bereichen |
| datetime.md | Alles mit Zeitstempeln, Zeitzonen, Intervallen, extract, date_trunc, to_char, to_timestamp |
| json.md | Sie JSONB speichern, abfragen, indizieren oder aktualisieren, jsonpath, JSON_VALUE, JSON_TABLE, JSON-Aggregate |
| queries.md | SELECT-Logik: NULL-Semantik, Joins, LATERAL, Gruppierung, Aggregate, Fensterfunktionen, Paginierung, UNION, CTEs |
| writes.md | INSERT ON CONFLICT, UPDATE und DELETE-Joins, Batch-Verarbeitung großer Änderungen, RETURNING, MERGE, COPY, Massenladen |
| indexes.md | Sie einen Index auswählen oder überprüfen: Typen, Spaltenreihenfolge, Skip Scan, partiell, Ausdruck, INCLUDE, pattern_ops, GIN, BRIN |
| concurrency.md | Isolationsstufen, Wiederholungen, Zeilen- und Tabellensperren, Deadlocks, Advisory Locks, Timeouts, LISTEN und NOTIFY |
| performance.md | EXPLAIN lesen, Statistiken und erweiterte Statistiken, Vakuum, Speicher- und Planereinstellungen, parallele Abfragen, pg_stat_statements |
| security.md | GRANT und Standardberechtigungen, Rollen, zeilenbasierte Sicherheit, SECURITY DEFINER, Passwörter, TLS und libqp-Verbindungsparameter |
| plpgsql-triggers.md | Funktionen, PL/pgSQL, dynamisches SQL, Ausnahmen, Trigger, Prozeduren schreiben |
| text-search.md | Zeichenfolgenfunktionen, LIKE und Regex, Zitieren, Volltextsuche mit tsvector, Ranking, ts_headline |
Bei einem Upgrade zu beachtende PostgreSQL-18-Änderungen
initdbaktiviert Datenprüfsummen standardmäßig, undpg_upgradebenötigt übereinstimmende Einstellungen. https://www.postgresql.org/docs/18/release-18.html- VACUUM und ANALYZE auf einer partitionierten Tabelle verarbeiten auch ihre Partitionen. Schreiben Sie
ONLYfür die übergeordnete Tabelle allein. https://www.postgresql.org/docs/18/release-18.html pg_upgradebehält Planungsstatistiken, aber keine erweiterten Statistiken. https://www.postgresql.org/docs/18/release-18.html- AFTER-Trigger laufen als die Rolle, die aktiv war, als das Ereignis in die Warteschlange gestellt wurde. https://www.postgresql.org/docs/18/release-18.html
- Asynchrone E/A (
io_method, Standardworker) undeffective_io_concurrencyhat standardmäßig den Wert 16. https://www.postgresql.org/docs/18/runtime-config-resource.html
Alte Muster
| Alt | Aktuell |
|---|---|
'now'- oder 'today'-Literale in Voreinstellungen | now(), CURRENT_DATE (https://www.postgresql.org/docs/18/datatype-datetime.html) |
MD5-Passwörter, password-Authentifizierungsmethode | scram-sha-256 (https://www.postgresql.org/docs/18/auth-password.html) |