wake-up-neo.com

PostgreSQL-Fehler: Beziehung existiert bereits

Ich versuche, eine Tabelle zu erstellen, die zuvor gelöscht wurde. 

Aber wenn ich den CREATE TABLE A .. mache. Ich bekomme unter Fehler: 

Beziehung 'A' existiert bereits.

Ich habe verifiziert, SELECT * FROM A zu tun, aber dann bekam ich einen weiteren Fehler: 

Beziehung 'A' existiert nicht.

Ich habe bereits versucht, es in \dS+ zu finden und alle Beziehungen aufzulisten, und es ist nicht da.
.__ Um das zu erschweren, habe ich dies getestet, indem ich diese Tabelle in einer anderen Datenbank erstellt habe und den gleichen Fehler erhalten habe. Ich denke, das könnte ein Fehler sein, wenn diese Tabelle gelöscht wurde. Irgendwelche Ideen?

Hier ist der Code: Ich verwende einen von Power SQL generierten Code. Ich habe den gleichen Fehler, ohne die Sequenz zu verwenden. Es funktioniert einfach, wenn ich den Namen ändere und in diesem Fall kann ich das nicht.

CREATE SEQUENCE csd_relationship_csd_relationship_id_seq;
CREATE TABLE csd_relationship (
    csd_relationship_id INTEGER NOT NULL DEFAULT nextval('csd_relationship_csd_relationship_id_seq'::regclass),  
    type_id INTEGER NOT NULL,
    object_id INTEGER NOT NULL,
    CONSTRAINT csd_relationship PRIMARY KEY (csd_relationship_id)
);
32
nsbm

Endlich entdecke ich den Fehler. Das Problem ist, dass der Name der Primärschlüsseleinschränkung gleich dem Tabellennamen ist. Ich weiß nicht, wie Postgres Einschränkungen darstellt, aber ich denke, der Fehler "Relation bereits existiert" wurde beim Erstellen der Primärschlüsseleinschränkung ausgelöst, da die Tabelle bereits deklariert wurde. Aufgrund dieses Fehlers wurde die Tabelle am Ende jedoch nicht erstellt.

30
nsbm

Hier sollten keine einfachen Anführungszeichen stehen 'A'. Einfache Anführungszeichen sind für String-Literale: 'some value'.
Verwenden Sie entweder doppelte Anführungszeichen, um die Großschreibung von "A" zu erhalten:

CREATE TABLE "A" ...

Oder verwenden Sie überhaupt keine Anführungszeichen:

CREATE TABLE A ...

das ist identisch mit

CREATE TABLE a ...

weil alle nicht in Anführungszeichen gesetzten Bezeichnerin PostgreSQL automatisch zu Kleinbuchstaben gefaltet werden.


Sie können Probleme mit dem Indexnamen vollständig vermeiden, indem Sie eine einfachere Syntax verwenden:

CREATE TABLE csd_relationship (
    csd_relationship_id serial PRIMARY KEY,
    type_id integer NOT NULL,
    object_id integer NOT NULL
);

Entspricht der ursprünglichen Abfrage, nur Namenskonflikte werden automatisch vermieden. Die nächste freie Kennung wird automatisch ausgewählt. Mehr zum seriellen Typ in der Anleitung .

12

Sie können keine Tabelle mit einem Namen erstellen, der mit einer vorhandenen Tabelle oder Sicht im Cluster identisch ist. Um eine vorhandene Tabelle zu ändern, verwenden Sie ALTER TABLE (link) , oder löschen Sie alle Daten in der Tabelle und erstellen Sie eine leere Tabelle mit dem gewünschten Schema. Geben Sie DROP TABLE vor CREATE TABLE aus.

Es kann sein, dass die Sequenz, die Sie erstellen, der Täter ist. In PostgreSQL werden Sequenzen als Tabelle mit einem bestimmten Spaltensatz implementiert. Wenn Sie die Sequenz bereits definiert haben, sollten Sie die Erstellung wahrscheinlich überspringen. Leider gibt es in CREATE SEQUENCE kein Äquivalent zum IF NOT EXISTS-Konstrukt, das in CREATE TABLE verfügbar ist. Wie es aussieht, können Sie Ihr Schema sowieso unbedingt erstellen, so dass es sinnvoll ist, es zu verwenden 

DROP TABLE IF EXISTS csd_relationship;
DROP SEQUENCE IF EXISTS csd_relationship_csd_relationship_id_seq;

vor dem Rest Ihrer Schemaaktualisierung; Falls dies nicht offensichtlich ist, werden mit alle Daten in der csd_relationship-Tabelle gelöscht, falls

In meinem Fall hatte ich eine Sequenz mit demselben Namen.

3

Ein weiterer Grund, warum Sie möglicherweise Fehler wie "Relation ist bereits vorhanden" erhalten, ist, wenn der Befehl DROP nicht ordnungsgemäß ausgeführt wurde.

Dies kann beispielsweise der Fall sein, wenn andere Sitzungen mit der Datenbank verbunden sind, die Sie zuerst schließen müssen.

2
isedwards

In meinem Fall war es nicht der einzige Fehler, den ich bekommen hatte, bis ich die Batchdatei PAUSEd und ein wenig nach oben gescrollt habe. Mein DROP-Befehl wurde zu DROP, und so fiel die Tabelle überhaupt nicht ab (die Beziehung bestand also tatsächlich noch). Der , den ich gelernt habe, heißt Byte Order Mark (BOM). Wenn Sie dies in Notepad ++ öffnen, speichern Sie die SQL-Datei erneut, wobei Encoding auf UTM-8 ohne Stückliste gesetzt ist.

2
user5775085

In meinem Fall habe ich von 9.5 auf 9.6 migriert ... Um eine Datenbank wiederherzustellen, habe ich Folgendes getan:

Sudo -u postgres psql -d databse -f dump.sql

Natürlich wurde es in der alten PostgreSQL-Datenbank ausgeführt, wo Daten vorhanden sind! Wenn sich Ihre neue Instanz auf Port 5433 befindet, lautet der korrekte Weg:

Sudo -u postgres psql -d databse -f dump.sql -p 5433
0