Fehler: Relation ... existiert nicht, evtl. aufgrund von CREATE TABLE Reihenfolge?

Hallo Leute,

Bin gerade mit Postgresql angefangen und alles in allem gilt das auch f�r Datenbanken im allgemeinen.
Da wollt ich doch nur eben ein paar Tabellen mit gekreuzten Fremdschl�sseln erstellen und was muss ich erfahren?

"HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index �land_pkey� f�r Tabelle �land�
FEHLER: Relation �provinz� existiert nicht

********** Fehler **********

FEHLER: Relation �provinz� existiert nicht
SQL Status:42P01"

Hier der Code zum Fehler:

CREATE TABLE Land(
    Name char(20),
    Code char(2) PRIMARY KEY,
    Stadt char(20) REFERENCES Provinz(Pname),
    Flaeche integer
);
CREATE TABLE Stadt(
    Sname char(20) PRIMARY KEY,
    Code char(2) REFERENCES Land(Code),
    Pname char(20) REFERENCES Provinz(Pname),
    Einwohner integer,
    Lgrad numeric,
    Bgrad numeric
);
CREATE TABLE Provinz(
    Pname char(20) PRIMARY KEY,
    Code char(2) REFERENCES Land(Code),
    Flaeche integer
);
CREATE TABLE Mitglied(
    Code char(2) REFERENCES Land(Code),
    Organisation char(2),
    Art char(15)
);

CREATE TABLE Lage(
    Code char(2) REFERENCES Land(Code),
    Kontinent char(15),
    Prozent integer
);
COMMIT;

W�r echt spitze, wenn euch dazu was einf�llt!
Btw, kennt jemand einen step-by-step-guide f�r das Einf�gen von Tabelleninhalten aus csv Dateien? Hab mich schon m�chtig lang damit besch�ftigt, und obwohl es anscheinend so einfach sein soll ein copy from auszuf�hren hab ich da so meine Probleme gehabt^^

Vielen Dank f�r Eure Zeit, johnny

Hi,

das umbauen zu:

CREATE TABLE Land(
    Name char(20),
    Code char(2) PRIMARY KEY,
    --Stadt char(20) REFERENCES Provinz(Pname),
    Stadt char(20),
    Flaeche integer
);
CREATE TABLE Provinz(
    Pname char(20) PRIMARY KEY,
    Code char(2) REFERENCES Land(Code),
    Flaeche integer
);
CREATE TABLE Stadt(
    Sname char(20) PRIMARY KEY,
    Code char(2) REFERENCES Land(Code),
    Pname char(20) REFERENCES Provinz(Pname),
    Einwohner integer,
    Lgrad numeric,
    Bgrad numeric
);
CREATE TABLE Mitglied(
    Code char(2) REFERENCES Land(Code),
    Organisation char(2),
    Art char(15)
);

CREATE TABLE Lage(
    Code char(2) REFERENCES Land(Code),
    Kontinent char(15),
    Prozent integer
);

alter table land add foreign key (stadt) references provinz(pname);

Also einfach den foreign key dann definieren, wenn die Tabelle existiert.

Und zum COPY gibt es eine man-page und die Doku. Lesen, probieren, konkrete Fragen zur Not hier stellen.


Andreas

Hey, vielen Dank!

Bekomme nun bei dieser Eingabe:

COPY Stadt(Sname, Code, Pname, Einwohner, Lgrad, Bgrad)
    FROM 'Dateipfad'
    DELIMITER AS ',';
COMMIT;

eine Fehlermeldung die besagt, dass noch Daten nach der letzten Spalte sind. Die Tabelle ist in einer csv Datei gespeichert, hat keine header für die Spalten und hat auch ansonsten keine Einträge.

********** Fehler **********

FEHLER: zusätzliche Daten nach letzter erwarteter Spalte
SQL Status:22P04
Kontext:COPY stadt, Zeile 1: »“Berlin”,“D”,“Berlin”,3472,“13,2”,“52,45”«

Kann sich das jemand erklären?
Bin dankbar für jede Hilfe!

Für Lgrad und Bgrad werden numerische Werte erwartet, Du lieferst da im CSV aber Zahlen mit Kommas. An den Kommas vermutet er dann den Wert für die nächste Spalte.

Du solltest versuchen, aus den Kommas da einen Punkt zu machen.


Zumindest vermute ich, daß das der Fehler ist…


Andreas

Sieht gut aus, jetzt kommt wieder ein Reihenfolgen-Problem, denn die Fremdschlüsselconstraints sind ja schon vorhanden und deshalb schliessen die Tabellen das gegenseitige Einfügen aus. Mein Ansatz wär jetzt alle Tabellen zu löschen, alle Fremdschlüssel erstmal weglassen, Daten reinschieben, Fremdschlüssel nachreichen. Das funktioniert aber nicht, weil ja die Zeilen mit den Fremdschlüsseln auch erst nachträglich erzeugt werden. Gibt es eine Möglichkeit den Spalten eine Fremdschlüsselconstraint im Nachhinein zu verpassen?

Es geht einfacher:

test=# create table a (a_id int primary key, b_id int, value text);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "a_pkey" for table "a"
CREATE TABLE
test=*# create table b (b_id int primary key, a_id int references a deferrable, value text);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "b_pkey" for table "b"
CREATE TABLE
test=*# alter table a add foreign key (b_id) references b deferrable;
ALTER TABLE
test=*# set constraints all deferred;
SET CONSTRAINTS
test=*# insert into a values (1,1,'value a');
INSERT 0 1
test=*# insert into b values (1,1,'value b');
INSERT 0 1

Andreas

Wow, nochmals vielen Dank, habe heute viel gelernt. Guten Abend noch!
Gruss Roger