tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

Jiný způsob getInsertId() a získávání defaulně vložených hodnot u PostgreSQL

před 8 lety

Milo
Nette Core | 1119

PostgreSQL má oproti SQL standardu INSERT a UPDATE rozšířeny o klauzuli RETURNING. S její pomocí lze získat hodnoty defaultně vložené do řádku.

CREATE TABLE user (
    id     SERIAL,
    login  VARCHAR NOT NULL,
    name   VARCHAR NOT NULL,
    active INTEGER NOT NULL DEFAULT 1,
    CONSTRAINT user_pkey PRIMARY KEY(id)
);
// Nově vytvořená hodnota primárního klíče
$id = dibi::query('INSERT INTO user (login, name) VALUES (%s, %s)', $x, $y, 'RETURNING id')->fetchSingle();

// Ekvivalentem je
dibi::query('INSERT INTO user (login, name) VALUES (%s, %s)', $x, $y);
$id = dibi::getInsertId();

// Pokud ale chceme získat i to, co se defaultně vložilo do sloupce `active` můžeme
$row = dibi::query('INSERT INTO user (login, name) VALUES (%s, %s)', $x, $y, 'RETURNING id, active')->fetch();

// V případě UPDATE lze získat všechny změněné řádky
$updatedRows = dibi::query("UPDATE user SET name = 'Josef' WHERE name = 'Pepa' RETURNING id")->fetchAll();

// Vracené sloupce lze získat všechny zkráceně
'RETURNING *'

// Případně je aliasovat
'RETURNIN col1 AS [Sloupec1], col2 AS [Sloupec2]'

před 8 lety

Honza Kuchař
Backer | 1649

Díky, tohle je super! Ještěže teď stavím systém na PostgreSQL :-)

před 8 lety

Semik
Člen | 124

Lze použít RETURNING i u ORacle databáze ?? Podle mě ne, protože se musí sloupce, které se mají vrátit nastavit voláním oci_bind_by_name, což v driveru není, ale myslím že by to šlo dopsat.

před 8 lety

Semik
Člen | 124

Pak ještě je možnost tu vloženou hodnotu získat ze sekvence pokud jde jen o ID, ale musí to být zase v transakci aby to bylo sekvenčně.