[ miličić.marko @ 29.04.2007. 20:40 ] @
Kako da iz PHP-a ubacim red u neku tabelu, a kao rezultat dobijem id tj. primarni knjuc pod kojim je taj red ubacen u bazu?

Na primer hocu da izvrsim 'INSERT INTO korisnici ('ime', 'prezime') VALUES ('Pera', 'Peric') i time dodam red u tabelu strukture (ID, IME, PREZIME). Ono sto meni treba je ID pod kojim je red snimljen u bazu.

Hvala
[ Miloš Baić @ 30.04.2007. 09:16 ] @
Ako sam te dobro razumeo, ID treba da bude autoincrement?
Mislim da PostgreSQL 8.2 ima tu opciju.

Edit: ima.

[Ovu poruku je menjao Miloš Baić dana 30.04.2007. u 14:42 GMT+1]
[ chachka @ 30.04.2007. 11:00 ] @
Treba ti PostgreSQL 8.2:
Code:

INSERT INTO korisnici (ime, prezime) VALUES ('Pera', 'Peric') RETURNING id;
[ miličić.marko @ 30.04.2007. 20:49 ] @
Hvala. Bas mi je to trebalo :)
[ karas @ 11.05.2007. 11:59 ] @
PHP kod
Code:

$res = pg_query("INSERT INTO users(username, password, cursms, maxsms) VALUES('pera', 'pera', 0, 100) RETURNING id");
$rows = array();
$rows = pg_fetch_row($res);
echo("<p>$rows[0]</p>");

vraća ID unetog reda, ali izgleda da iz C-a to ne ide.
Code:

string query = "INSERT INTO users(username, password, cursms, maxsms) VALUES('pera', 'pera', 0, 100) RETURNING id";
PGresult* res = PQexec(dbConn, query.c_str());
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
    PQclear(res);
    throw runtime_error("inserting into users table failed");
}
PQclear(res);

baca izuzetak mada upisuje podatak u bazu. Pored toga, nije jasno da li podatak koji se vraća treba prihvatiti preko PQgetvalue(). Ne znam da li ja negde grešim ili je problem do libpq biblioteke.
[ chachka @ 11.05.2007. 22:06 ] @
Posto se kao rezultat dobija torka (tuple), pri proveri bi trebalo da se koristi
Code:

PGRES_TUPLES_OK
a ne
Code:

PGRES_COMMAND_OK

Ne znam C, ali mi po dokumentaciji o libpq i PQresultStatus to deluje logicno.
[ karas @ 14.05.2007. 13:33 ] @
Jeste, hvala.
[ 3emyh @ 15.06.2007. 21:03 ] @
A kako to isto da uradim ako imam stariju verziju PG-a koja ne podrzava returning, a da ne instaliram novu verziju?
[ miličić.marko @ 17.06.2007. 00:16 ] @
Mozes sam da napises stored proceduru koja ce da vrati ID posle insert-a. Na primer nesto ovako:

Code:

DECLARE
    _kod_proizvoda INTEGER;
BEGIN
    INSERT INTO jezgro.proizvodi (pocetak, kraj, stavki_dostavljeno, status_dostave)
        VALUES(NOW(), NULL, NULL, 15);

    SELECT INTO _kod_proizvoda
        currval('jezgro.proizvodi_kod_seq') AS kod
    ;

    RETURN _kod_proizvoda;
END;
[ karas @ 17.06.2007. 13:36 ] @
Pogledaj funkcije currval i nextval, poglavlje 9.12 Sequence Manipulation Functions dokumentacije za Postgres.
[ Svemirko Joca @ 10.10.2007. 15:26 ] @
Citat:
chachka: Treba ti PostgreSQL 8.2:
Code:

INSERT INTO korisnici (ime, prezime) VALUES ('Pera', 'Peric') RETURNING id;

ili sam corav ili ovo kod mene ne radi !!!

Code:

INSERT INTO komentar(ime, komentar) VALUES ('hajde', 'radi bre') RETURNING id;

odgovor iz pgAdmin dobijam ovako:

ERROR: could not open relation with OID 1
SQL state: XX000

kako sam trebao kreirati tabelu tacnije kolonu id.
kod mene je ovako
dafault value : nextval((1)::regclass)

gde gresim.....
ako moze sto pre odgovor, krajnje mi je hitno !
Hvala
[ chachka @ 10.10.2007. 15:56 ] @
Netreba
Code:

nextval((1)::regclass)
, nego
Code:

nextval('neka_sekvenca'::regclass)
[ Svemirko Joca @ 10.10.2007. 16:14 ] @
hvala za munjevit odgovor ali nije mi pomogao... bas se lose snalazim sa ovim adminpanelom.... sve nesto klikcem nikako da uzmem lepo da kucam sql (mada koliko se razlikuju sql-ovi od baza do baza pitanje je da li bi i znao :P )

CREATE TABLE komentar1
(
id integer NOT NULL DEFAULT nextval(('aaa')::regclass),
ime character varying(30) NOT NULL,
komentar text NOT NULL,
PRIMARY KEY (id)
) WITHOUT OIDS;

javlja
error: relation 'aaa' does not exist

moze li mi neko reci gde mogu da kucam sql a ne da klikcem (kada to klikcem na kraju imam sql jezicak ali tamo mogu samo da gledam a ne i da kucam) i ako nije problem da mi neko kaze kako bi trebao da izgleda sql za ovu bazicu.

znaci ime komentar da ima id int, koji se inkrementira i koji je primary, ime koje je duzine do 30 karaktera i komentar u obliku texta (ovo ime i komentar radi... zeza ovaj id).
posle mi treba da u kodu uradim upis sa insert into komentar (ime, komentar) values ($ime, $komentar);
krajnje jednostavno... ovo sam uradio u mssql-u i mysql-u a sada trebam i u ovom :)

jos jednom tnx
[ chachka @ 10.10.2007. 18:41 ] @
Adminpanel za PostgreSQL?!? Sta je to?

U cemu kucati SQL, to jest u cemu izvrsavati SQL? Postoji:
- DOS command line alat psql,
- PgAdmin,
- SQL Manager 2007 for PostgreSQL (moja preporuka bilo da je Full ili Lite varijanta),
- PostgreSQL Maestro,
- phpPgAdmin.

Za ono sto tebi treba je najlakse koristiti SERIAL:
Code:

CREATE TABLE komentar1
(
id SERIAL NOT NULL, 
ime character varying(30) NOT NULL, 
komentar text NOT NULL, 
PRIMARY KEY (id)
) WITHOUT OIDS;


[Ovu poruku je menjao chachka dana 10.10.2007. u 21:53 GMT+1]
[ Svemirko Joca @ 10.10.2007. 18:56 ] @
@chachka
Ma mislio sam ovaj pgadmin ali kako sam ovo tek danas instalirao nisam mu jos naucio ime tako da sam napisao kao adminpanel :P

command line najvise volim (za mysql samo to koristim) ali kada uzmem cmd

C:\Program Files\PostgreSQL\8.2\bin>psql
Password:
psql: FATAL: password authentication failed for user "Pedja"
e sad probao sam sve sifre koje bi dolazile u obzir (iskren da budem ne secam se dok sam vrsio instalaciju tako da sam zaboravio da li sam i sta uneo za pass) ali probao sam neke moje standardne passove i nece.... a preko pgadmina se logujem totalno sa drugim userom... nemam pojma odakle ovaj pedja :P

tako da za sada koristim samo pgadmin (ono sto ide uz samu instalaciju)

E ovo tvoje radi... no ovo sad prvi put vidim... pre nego sto sam postovao googlao sam auto_incremet za postgre i uvek sam vidjao ovaj nexval() ...... sta li je onda ovo serial ?! :)

u svakom slucaju ovaj tvoj sql radi pa razbija i php kod vise ne javlja gresku

HVALA PUNO !

Edit: Uređivanje teme

[Ovu poruku je menjao chachka dana 10.10.2007. u 21:55 GMT+1]
[ chachka @ 10.10.2007. 21:17 ] @
Otkucaj u komand promtu:
Code:
psql --help
Upoznaj se sa parametrima i opcijama koje se koriste uz komandu psql.


Na brzinu, ono što tebi treba je da specificiraš korisničko ime i bazu na koju želiš da se loguješ. To se postiže sa:
Code:
psql -U pg_korisnicko_ime -d ime_baze
Napomena: Mora biti veliko U! Tada ćeš morati da uneseš lozinku za prosleđenog korisnika.


A otkud 'Pedja'? Pa to je verovatno korisnik kojeg si naveo prilikom instalacije WinXP-a :)


SERIAL je samo skraćen način za obavljanje nekoliko akcija koje se sastoje u:
- kreiranju sekvence,
- dodeljivanju default vrednosti nekom atributu upotrebom nextval() funkcije koja kao parametar ima predhodno kreiranu sekvencu.
O ovome možeš pročitati u PostgreSQL online dokumentaciji o numeričkim tipovima podataka.
[ Svemirko Joca @ 10.10.2007. 22:24 ] @
Hvala puno !
Zaista skratio si mi vreme za nerviranje jedno 2 dana :)
pokusavao sam ja i da googlam, ali nisam bas nailazio na neko resenje
evo ovo sam koristio....
http://www.linuxnetworks.de/do..._SQL/Statements/Generating_IDs
ima tamo PostgreSQL deo i ne znam kako mi nije prosao taj kod.... tamo su ga stavili a meni nije hteo da radi....

u svakom slucaju hvala puno, ovo sam zavrsio a sada prelazim na Firebird :P
p.s. nije da sam expert za ovo pocetnik sam ali cinimi se da za sada nece vise biti problema sa posgre :P
[ michaelk @ 12.10.2007. 16:15 ] @
@chachka:
SQL Manager 2007 for PostgreSQL (moja preporuka bilo da je Full ili Lite varijanta),

I moja samo ako mozes da dodes do verzije 2005 posto verzija 2007 ima bug-ove koje jos uvek nisu uspeli da otklone a ja sam ih poslao ( i potvrdeni su) jos negde u julu i dosad ih nisu uspeli otkloniti. Doduse svi se odnose na "Code completition" ali ako puno tuces po procedurama i upitima takva stvar ti mnogo znaci pogotovo ako si je imao pre (verzija 2005) i radila je besprekorno a sada neradi.