Autor | Zpráva | ||
---|---|---|---|
vlado Profil * |
#1 · Zasláno: 16. 9. 2013, 21:48:06 · Upravil/a: vlado
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 |
#2 · Zasláno: 16. 9. 2013, 22:25:33
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 * |
#3 · Zasláno: 17. 9. 2013, 05:05:28 · Upravil/a: Moderátor (editace znemožněna) 17. 9. 2013, 08:44:58
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 |
#4 · Zasláno: 17. 9. 2013, 09:28:15
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; |
||
vlado Profil * |
#5 · Zasláno: 17. 9. 2013, 17:56:18 · Upravil/a: vlado
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 |
#6 · Zasláno: 17. 9. 2013, 18:44:03
Č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 |
#7 · Zasláno: 17. 9. 2013, 18:46:57
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 * |
#8 · Zasláno: 17. 9. 2013, 18:59:54
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 |
||
Časová prodleva: 11 let
|
0