/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Postgres SERIAL som PK
Fra : Morten Primdahl


Dato : 05-05-01 20:53


Hejsa. Posgres forvirrer mig mht. SERIAL som PK. Se
flg. eksempel.

CREATE TABLE tbl_a (id SERIAL PRIMARY KEY, data VARCHAR(5));
CREATE TABLE tbl_b (id SERIAL PRIMARY KEY, data VARCHAR(5));

CREATE TABLE tbl_c
(id SERIAL PRIMARY KEY,
data VARCHAR(50),
a SERIAL CONSTRAINT a_ref REFERENCES tbl_a(id),
b SERIAL CONSTRAINT b_ref REFERENCES tbl_b(id)
);

INSERT INTO tbl_a (data) VALUES ('a data');
INSERT INTO tbl_b (data) VALUES ('b data');

Alt er godt hertil.

INSERT INTO tbl_c (data, a, b) VALUES ('c data',1,1);

Denne fejler med besked: Relation 'tbl_c_id_seq' does not exist
På trods af, at postgres implicit opretter netop denne
sequence når PK er SERIAL og tbl_c oprettes. Det skriver
den i det mindste som en NOTICE i prompten.

Har jeg misforstået postgres SERIAL typen?

Mvh Morten

 
 
Nils Lastein (07-05-2001)
Kommentar
Fra : Nils Lastein


Dato : 07-05-01 12:37

-- snip --
> CREATE TABLE tbl_a (id SERIAL PRIMARY KEY, data VARCHAR(5));
> CREATE TABLE tbl_b (id SERIAL PRIMARY KEY, data VARCHAR(5));
>
> CREATE TABLE tbl_c
> (id SERIAL PRIMARY KEY,
> data VARCHAR(50),
> a SERIAL CONSTRAINT a_ref REFERENCES tbl_a(id),
> b SERIAL CONSTRAINT b_ref REFERENCES tbl_b(id)
> );
>
> INSERT INTO tbl_a (data) VALUES ('a data');
> INSERT INTO tbl_b (data) VALUES ('b data');
>
> Alt er godt hertil.
>
> INSERT INTO tbl_c (data, a, b) VALUES ('c data',1,1);
-- snip --

Jeg ville ikke mene, at du skal definere kolonnerne a og b i tbl_c, som
serial men istedet som integer. Ideen er jo, at værdierne til a og b i tbl_c
skal ref. til hhv. tbl_a og tbl_b. Serial-datatypen opretter jo automatisk
en sequencer (unique identifier) og når man indsætter en række i tbl_a og
tbl_b fastlægges automatisk værdien af id-kolonnen.

Nils



Morten Primdahl (08-05-2001)
Kommentar
Fra : Morten Primdahl


Dato : 08-05-01 23:42

Nils Lastein wrote:
>
> -- snip --
-- snip --

> Jeg ville ikke mene, at du skal definere kolonnerne a og b i tbl_c, som
> serial men istedet som integer. Ideen er jo, at værdierne til a og b i tbl_c
> skal ref. til hhv. tbl_a og tbl_b. Serial-datatypen opretter jo automatisk
> en sequencer (unique identifier) og når man indsætter en række i tbl_a og
> tbl_b fastlægges automatisk værdien af id-kolonnen.

Yep. Jeg antog at SERIAL var en speciel datatype a la Oracle's
NUMBER. Det viser sig at være en INT4 i postgres - derudover
var der rent faktisk en bug i postgres 7.0.3 således sequences
ikke blev oprettet hvis der var flere SERIAL's i samme tabel.

Mvh Morten

Per Erik Ronne (09-05-2001)
Kommentar
Fra : Per Erik Ronne


Dato : 09-05-01 11:30

Morten Primdahl <morten@primdahl.net> wrote:

> Yep. Jeg antog at SERIAL var en speciel datatype a la Oracle's
> NUMBER. Det viser sig at være en INT4 i postgres - derudover
> var der rent faktisk en bug i postgres 7.0.3 således sequences
> ikke blev oprettet hvis der var flere SERIAL's i samme tabel.

Øh - hvad skal du bruge mere end én serial i samme tabel? Serials bruges
da til at oprette unikke indexer i en tabel, og en barnetabel til
forældertabellen henter så fremmednøglen fra forældertabellen.
--
Per Erik Rønne
Frederikssundsvej 308B, DK-2700 Brønshøj, DENMARK, EUROPEAN UNION
Tlf. + fax: +38 89 00 16, mobil +45 28 23 09 92.
Homepage http://www.diku.dk/students/xerxes

Søg
Reklame
Statistik
Spørgsmål : 177554
Tips : 31968
Nyheder : 719565
Indlæg : 6408857
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste