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
Upozornění: Tohle vlákno je hodně staré.
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ě.