Liebe Community
bin ganz neu hier und in PostgreSQL ein totaler Noob.
Mein Chef will von MySQL auf PostgreSQL umsteigen. Wir haben eine Access-Datenbank und beim Erstellen eines neuen Datensatzes bekomme ich folgende Fehlermeldung:“doppelter Schlüsselwert verletzt Unique-Constraint „ärzte-pkey“; Error while executing the query (#7)”
Habe schon diverse Foren durchkämmt und kam immer wieder zu Hinweisen wie
SELECT setval(“ärzte_aID”, 1285, true);
aID ist hier der PK.
Leider macht PostgreSQL da nichts, ausser mir eine Fehlermeldung auszugeben:
Spalte »ärzte_aID« existiert nicht
das gleiche auch, wenn ich “ärzte_” weglasse, dann kommt “Spalte »aID« existiert nicht”.
Die Spalte existiert aber sehr wohl.
Was mache ich falsch und wie kann ich es erreichen, dass ich einen neuen Datensatz ohne Fehlermeldung anlegen kann?
Recht herzlichen Dank für eure Unterstützung
Bitte zeige uns das vollständige CREATE TABLE statement für die Tabelle.
Hallo castorp
Danke für die schnelle Antwort - würde ich gern - allerdings habe ich dazu ein Programm benutzt, welches mir MySQL zu PostgreSQL umwandelt.
Wie gesagt - bin totaler Anfänger.
Kann ich das nachträglich noch irgendwo nachlesen? Bei anderen Tabellen habe ich das Problem übrigens (scheinbar) nicht.
In psql kannst Du ein “\d name_der_tabelle” machen. Das zeigt zwar (leider) nicht das CREATE TABLE statement an, aber die vollständige Definition der Tabelle. Andere SQL clients haben andere Möglichkeiten das zu machen - das hängt stark davon ab, was Du als SQL Client verwendest. In pgAdmin wird das glaube ich irgendwo in den Eigenschaften der Tabelle angezeigt (ich verwende pgAdmin nicht, deswegen weiß ich das nicht so genau).
Okay, danke für die Erklärung.
Wenn ich in psql folgendes eingebe
\d ärzte
kommt folgende Fehlermeldung
Keine Relationen namens »"rzte« gefunden
Die Tabelle heisst “ärzte”.
Was ist diese constraint pkey, die es immer automatisch anlegt? So wie ich es verstehe eine Art Primary key, aber den hab ich ja schon in der Tabelle. Ich glaube, der Konflikt entsteht hier, weil die Werte nicht übereinstimmen. Wie kann ich den Inhalt von “ärzte_pkey” einsehen?
Viele Grüsse
Dr. Gonzo
Du solltest tunlichst Umlaute in Tabellen- und Spaltennamen unterlassen. Und auch keine Groß/Kleinschreibung. Das machst das Leben einfacher.
Gibt mal in psql einfach nur ein \d ein, dann bekommst Du alle Tabellen im Suchpfad. Dann kannst Du Dir die betreffende mit \d anschauen.
Und ja: die Tabelle ist mit einem Primary Key erstellt, und vermutlich mit einer Sequence. Um das mal zu zeigen:
test=*# create table xyz(id serial primary key);
CREATE TABLE
test=*# \d xyz
Tabelle »public.xyz«
Spalte | Typ | Attribute
--------+---------+------------------------------------------------------
id | integer | not null Vorgabewert nextval('xyz_id_seq'::regclass)
Indexe:
"xyz_pkey" PRIMARY KEY, btree (id)
test=*#
xyz_id_seq wäre der Name der Sequence in diesem Falle.
Okay, ich glaub ich habs kapiert. Wenn ich in der Tabelle die Spalte “aID” als Primary Key festlege, erstellt mir PG automatisch die constraint “Ärzte_pkey” und verknüpft “aID” damit. Dann kann ich in der Tabelle aber keinen neuen DS anlegen. Lösche ich die constraint, dann kann ich Daten eingeben, aber der Primary key ist weg. Die Datensätze fangen immer wieder mit dem Wert 1 an.
Okay, bin so vorgegangen wie akretschmer geschrieben hat (übrigens: das mit den Umlauten weiss ich, nur mein Chef nicht, der hat die DB vor 10 Jahren mal entworfen und ich hab den Spass jetzt damit MySQL hat das irgendwie gefressen, aber Postgresql nich so. Gibt auch Spaltennamen mit Leerzeichen drin und so Gemurkse)
So sieht das Ergebnis aus
Spalte | Typ | Attribute
-----------------------+-----------------------------+-----------------------------------------------------------
aID | integer | not null Vorgabewert nextval('"õrzte_aID_seq"'::regclass)
aAnrede | character varying(6) |
aTitel | character varying(20) |
aNachname | character varying(20) |
aVorname | character varying(15) |
aFachgebiet | character varying(35) |
aStrasse | character varying(35) |
aPostfach | character varying(35) |
aPLZ Ort | character varying(25) |
aEAN-Nr | character varying(20) |
aTel | character varying(20) |
aTel Direkt | character varying(20) |
aTel Mobile | character varying(20) |
aFAX | character varying(20) |
aBrief Anrede | character varying(40) |
aBrief Gruss | character varying(20) |
aBemerkung | character varying(255) |
aAktualisierungsdatum | timestamp without time zone |
umgangsform | character varying(30) |
erfasser | character varying(255) |
zeilensperre | timestamp without time zone |
zeitstempel | timestamp without time zone | not null Vorgabewert now()
aE-Mail | character varying(255) |
aE-Mail Privat | character varying(255) |
aHompage | character varying(255) |
Indexe:
"õrzte_pkey" PRIMARY KEY, btree ("aID")
-- Fortsetzung --
Wenn die Spalte einen default hat, dann darfst Du sie beim Insert nicht angeben:
insert into "Ärzte" ("aAnrede", "aTitel", "aNachname", ... ) values ('Herr', 'Dr', 'Müller-Lüdenscheid', ... );
Damit wird dann automatisch der Wert aus der Sequence genommen.
Okay, bin fündig geworden, mein Problem wurde durch die hier beschriebenen Schritte gelöst:
http://forum.notenmanager.net/showthread.php?tid=5373
Trotzdem allen ein fettes Dankeschön