Autor Zpráva
vlado
Profil *
Ahoj. Trápím se s jedním zápisem do databáze v PostgreSQL. Mám tyhle dvě tabulky :

CREATE TABLE vzkazy_data (
     id_vzkazu_data BIGSERIAL primary key,
     id_odesilatel_vzkazy_data BIGSERIAL not null,
     id_adresat_vzkazy_data BIGSERIAL not null,
     dorucenka_vzkazy_data boolean not null,
     vymazani_vzkazy_data SMALLINT not null,
     cas_zpravy TIMESTAMP not null
);

CREATE TABLE vzkazy_vazebni (
     id_vazby_vzkazy_vazebni BIGSERIAL primary key,
     text_vzkazy_vazebni TEXT not null
);

a teď potřebuju uložit vzkaz do vazební tabulky a jeho ID do tabulky se vzkazama... chtěl bych to udělat co nejsprávnějc a tak to zkoušim jedním jediným dotazem vyřešit, ale porád to skládám špatně. Nepomohl by s tím někdo?


edit : ... hodil jsem sem starý záznam. ta první tabulka je pochopitelně takhle :

CREATE TABLE vzkazy_data (
     id_vzkazu_data BIGSERIAL primary key,
     id_odesilatel_vzkazy_data BIGSERIAL not null,
     id_adresat_vzkazy_data BIGSERIAL not null,
     dorucenka_vzkazy_data boolean not null,
     vymazani_vzkazy_data SMALLINT not null,
     cas_zpravy TIMESTAMP not null,
     id_vzkazu_vzkazy_data BIGSERIAL not null
);
Kajman
Profil
Jedním dotazem dva inserty do různých tabulek neuděláte. Můžete si udělat proceduru nebo trigger na vložení, ale v něm stejně musí být inserty dva.
vlado
Profil *
No když to udělám tahle

insert into vzkazy_vazebni (text_vzkazy_vazebni) values ('test'); SELECT currval(pg_get_serial_sequence('vzkazy_vazebni', 'id_vazby_vzkazy_vazebni'));

s tím že text id_vazby_vzkazy_vazebni je typ SERIAL .. tak to ale dělá v těch IDčkách díry. dočetl jsem se, že je to normální, ale mě se to nelíbí.
Kajman
Profil
Mrkněte na možnost
insert into vzkazy_vazebni (text_vzkazy_vazebni) values ('test') returning id_vazby_vzkazy_vazebni

Dva inserty by šly asi zapsat i jako

WITH prvni AS
  (INSERT INTO vzkazy_vazebni(text_vzkazy_vazebni)
   VALUES('test')
   RETURNING id_vazby_vzkazy_vazebni)
INSERT INTO vzkazy_data (id_odesilatel_vzkazy_data, id_adresat_vzkazy_data, id_vzkazu_vzkazy_data, cas_zpravy)
SELECT 42,
       11,
       prvni.id_vazby_vzkazy_vazebni,
       CURRENT_TIMESTAMP
FROM prvni;
Ale nepřijde mi to přehlednější než postupné dva inserty.
vlado
Profil *
ten returning sem právě zkoušel, ale nechápu jak to funguje... proto musí bejt nějaká relace. Občas mi fungoval, pak jsem vydropoval dabulku, znovu jí vytvořil a už nefunguje. někde jsem našel příkaz na vytvoření té relace, ale není mi jasné kdy jí mám jako definovat.


Aha tak to bylo špatně definovanou tabulkou tentokrát. A co se týče těch děr v IDčkách... když použiju toto "insert into vzkazy_vazebni (text_vzkazy_vazebni) values ('test') returning id_vazby_vzkazy_vazebni" tak to dělat nebude?
Alphard
Profil
Četl jste o obvyklé návrhové chybě? Mezery v řadě id vůbec neřešte, je to běžné, ničemu to nevadí. Jestli někde chcete vypisovat pořadí, řeště to odděleně od id.
Kajman
Profil
vlado:
ten returning sem právě zkoušel, ale nechápu jak to funguje

Funguje to obdobně, jako získání dat ze selectu, který vrací jeden řádek a jeden sloupec.
vlado
Profil *
Alphard:
Právě mě to znervózňuje.. přijde mi to jako plejtvání idéčkama, ale dobře no. tak to řešit teda nebudu no.

Kajman:
děkuji

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: