|
| 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
| |
|
|