Erreur PostgreSQL: la Relation existe déjà

j'essaie de créer une table qui a été abandonnée auparavant.

Mais quand je fais le CREATE TABLE A ... Je suis d'erreur ci-dessous:

la Relation ' A ' existe déjà.

j'ai vérifié en faisant SELECT * FROM A, mais j'ai eu une autre erreur:

la Relation ' A ' n'existe pas.

j'ai déjà essayé de le trouver dans dS+ liste de toutes les relations, et il n'est pas là.

Pour compliquer, j'ai testé ceci en créant cette table dans une autre base de données et j'ai eu la même erreur. Je pense que cela pourrait être une erreur quand cette table a été abandonnée. Des idées?

voici le code: j'utilise un code généré à partir de Power SQL. J'ai la même erreur sans utiliser la séquence. Il fonctionne lorsque je change le nom et dans ce cas je ne peux pas le faire.

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)
);
29
demandé sur Brian Tompsett - 汤莱恩 2012-01-09 21:55:59

7 réponses

je découvre enfin l'erreur. Le problème est que le nom de la contrainte principale est égal au nom de la table. Je ne sais pas comment postgres représente les contraintes, mais je pense que l'erreur "la Relation existe déjà" a été déclenchée lors de la création de la contrainte principale parce que la table était déjà déclarée. Mais à cause de cette erreur, la table n'a pas été créée à la fin.

26
répondu nsbm 2012-01-12 12:57:40

Il ne devrait pas être entre guillemets simples ici 'A'. Les guillemets simples sont pour les lignes littérales: 'some value'.

Utilisez deux guillemets pour préserver l'orthographe de "A"en majuscules:

CREATE TABLE "A" ...

Ou n'utilisez pas de guillemets:

CREATE TABLE A ...

qui est identique à

CREATE TABLE a ...

parce que tous non cotés identificateursplié en minuscules automatiquement dans PostgreSQL.


vous pourriez éviter les problèmes avec le nom d'index complètement en utilisant la syntaxe plus simple:

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

fait la même chose que votre requête d'origine, seulement il évite les conflits de noms automatiquement. Il sélectionne automatiquement l'identifiant libre suivant. Plus sur le type de série dans le manuel.

10
répondu Erwin Brandstetter 2013-04-11 11:54:21

vous ne pouvez pas créer une table avec un nom identique à une table existante ou une vue dans le cluster. Pour modifier une table existante, utilisez ALTER TABLE (lien), ou pour laisser tomber toutes les données actuellement dans la table et créer une table vide avec le schéma désiré, édition DROP TABLE avant CREATE TABLE.

il se peut que la séquence que vous créez soit le coupable. Dans PostgreSQL, les séquences sont implémentées comme un tableau avec un ensemble particulier de colonnes. Si vous avez déjà le séquence définie, vous devriez probablement ignorer la création. Malheureusement, il n'y a pas d'équivalent dans CREATE SEQUENCEIF NOT EXISTS construction disponible en CREATE TABLE. A première vue, vous pourriez créer votre schéma inconditionnellement, de toute façon, il est donc raisonnable d'utiliser

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

avant le reste de votre mise à jour de schéma; au cas où ce ne serait pas évident, ceci supprimera toutes les données dans le csd_relationship tableau, si il est tout

5
répondu SingleNegationElimination 2014-05-23 14:47:09

dans mon cas, ce n'est que lorsque j'ai mis en pause le fichier batch et que je me suis un peu égaré que j'ai eu une erreur. Mon DROP le commandement était devenu DROP et donc la table ne tombait pas en premier lieu (donc la relation existait encore).  j'ai appris s'appelle un Byte Order Mark (BOM). En ouvrant ceci dans le bloc-notes++, sauvegardez à nouveau le fichier SQL avec Encoding réglé sur UTM-8 sans BOM et il fonctionne très bien.

2
répondu user5775085 2016-01-11 19:03:05

Dans mon cas, j'ai eu une séquence avec le même nom.

2
répondu Dave Van den Eynde 2016-08-25 15:06:35
sudo -u postgres psql -d databse -f dump.sql

bien sûr, il a été exécuté sur l'ancienne base de données postgreSQL où il ya des données! Si votre nouvelle instance est sur le port 5433, la bonne façon est:

sudo -u postgres psql -d databse -f dump.sql -p 5433
0
répondu Nicolas Boisteault 2016-10-05 10:30:15

une autre raison pour laquelle vous pourriez avoir des erreurs comme "relation existe déjà" est si le DROP la commande n'a pas été exécutée correctement.

une des raisons pour lesquelles cela peut se produire est s'il y a d'autres sessions connectées à la base de données que vous devez fermer en premier.

0
répondu isedwards 2018-09-21 11:58:14