Archiv der Kategorie: Postgres

Postgresql: Datenbank mit aktiven Connections löschen

Ein „DROP DATABASE mydb“ wird nicht funktionieren, solange es aktive Verbindungen gibt (pgbouncer, phpmyadmin, etc.). Manchmal können nicht alle Verbindungen identifiziert und geschlossen werden.

Dann hilft folgende SQL-Zeile (mydb durch eigenen Datenbanknamen ersetzen):

SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = 'mydb' AND pid <> pg_backend_pid();

Stackoverflow

Postgres: Zeilen einer Tabelle als Eingabe (INSERT) für ähnliche Tabelle verwenden (mit CTE)

Tabelle 1 (table1):
Hat die Spalten id, name, language, type

Tabelle 2 (table2):
Hat die Spalten id, name, language, type_id (identisch mit Tabelle 1 „type“)

Alle Zeilen mit dem Wert „fr“ als language sollen von der ersten Tabelle in die zweite Tabelle übernommen werden – mit einem SQL.

SET search_path TO 'public';

WITH 
    addressor_types as (SELECT type as type_id, name, language FROM table1 WHERE language='fr')

INSERT INTO table2 (type_id, name, language) (SELECT type_id, name, language FROM addressor_types);

SET search_path TO … = Setzen des Namensraumes, in dem Postgres sucht (kann weggelassen werden, wenn search_path=public)

WITH … = Common Table Expression (CTE), um die zutreffenden Zeilen der ersten Tabelle zwischenzuspeichern für den INSERT. Die Reihenfolge/Namen der Spalten beim INSERT muss/müssen übereinstimmen.

INSERT … = Der Befehl zum Einfügen der zuvor zwischengespeicherten Daten.

Postgresql: Timestamp bei Aktualisierung updaten (Trigger)

Die Deklaration einer Tabellenspalte mit default Current_Timestamp erzeugt noch kein Update des Timestamps bei einer Änderung in der Zeile.
Erst ein Trigger

CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.modified = now();
RETURN NEW;
END;
$$ language 'plpgsql';

CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON customer FOR EACH ROW EXECUTE PROCEDURE update_modified_column();

Postgres: Ändern Index (Serial/Sequence)

Mit ALTER SEQUENCE … lässt sich eine Sequenz ändern. Soll aber nur der Index auf einen neuen Wert gesetzt werden:

SELECT setval('name_index_id_seq',5000,True);

name_index_id_seq = Name der Sequenz

5000 = nächste ID die vergeben wird

True = Wert wird sofort geändert (man kann einen neuen Index auch angeben und erst mit ALTER SEQUENCE RESTART aktivieren)