Anlegen neuen Datensatzes - doppelter Schlüsselwert verletzt Unique-Constraint

Datenbank Migration (z. B. von MySQL auf PostgreSQL)
Antworten
DrGonzo
Neuer Benutzer
Beiträge: 19
Registriert: Di 18. Apr 2017, 10:41

Anlegen neuen Datensatzes - doppelter Schlüsselwert verletzt Unique-Constraint

Beitrag von DrGonzo » Di 18. Apr 2017, 10:46

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
Vielen Dank und freundliche Grüsse

Dr. Gonzo

castorp
Erfahrener Benutzer
Beiträge: 1001
Registriert: Sa 27. Jun 2009, 22:24
Kontaktdaten:

Re: Anlegen neuen Datensatzes - doppelter Schlüsselwert verletzt Unique-Constraint

Beitrag von castorp » Di 18. Apr 2017, 11:08

Bitte zeige uns das vollständige CREATE TABLE statement für die Tabelle.
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

DrGonzo
Neuer Benutzer
Beiträge: 19
Registriert: Di 18. Apr 2017, 10:41

Re: Anlegen neuen Datensatzes - doppelter Schlüsselwert verletzt Unique-Constraint

Beitrag von DrGonzo » Di 18. Apr 2017, 11:21

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.
Vielen Dank und freundliche Grüsse

Dr. Gonzo

castorp
Erfahrener Benutzer
Beiträge: 1001
Registriert: Sa 27. Jun 2009, 22:24
Kontaktdaten:

Re: Anlegen neuen Datensatzes - doppelter Schlüsselwert verletzt Unique-Constraint

Beitrag von castorp » Di 18. Apr 2017, 12:05

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).
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

DrGonzo
Neuer Benutzer
Beiträge: 19
Registriert: Di 18. Apr 2017, 10:41

Re: Anlegen neuen Datensatzes - doppelter Schlüsselwert verletzt Unique-Constraint

Beitrag von DrGonzo » Di 18. Apr 2017, 14:41

Okay, danke für die Erklärung.

Wenn ich in psql folgendes eingebe

Code: Alles auswählen

\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
Vielen Dank und freundliche Grüsse

Dr. Gonzo

akretschmer
Erfahrener Benutzer
Beiträge: 7280
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Anlegen neuen Datensatzes - doppelter Schlüsselwert verletzt Unique-Constraint

Beitrag von akretschmer » Di 18. Apr 2017, 14:55

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 <ENTER> ein, dann bekommst Du alle Tabellen im Suchpfad. Dann kannst Du Dir die betreffende mit \d <tablename> anschauen.

Und ja: die Tabelle ist mit einem Primary Key erstellt, und vermutlich mit einer Sequence. Um das mal zu zeigen:

Code: Alles auswählen

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.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

DrGonzo
Neuer Benutzer
Beiträge: 19
Registriert: Di 18. Apr 2017, 10:41

Re: Anlegen neuen Datensatzes - doppelter Schlüsselwert verletzt Unique-Constraint

Beitrag von DrGonzo » Di 18. Apr 2017, 15:19

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 :rolleyes: MySQL hat das irgendwie gefressen, aber Postgresql nich so. Gibt auch Spaltennamen mit Leerzeichen drin und so Gemurkse)

So sieht das Ergebnis aus

Code: Alles auswählen

       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  --
Vielen Dank und freundliche Grüsse

Dr. Gonzo

akretschmer
Erfahrener Benutzer
Beiträge: 7280
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Anlegen neuen Datensatzes - doppelter Schlüsselwert verletzt Unique-Constraint

Beitrag von akretschmer » Di 18. Apr 2017, 15:47

DrGonzo hat geschrieben:
Di 18. Apr 2017, 15:19
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.
Nicht ganz richtig. Du kannst keine Datensätze mit ID's anlegen, die es schon gibt. Du kannst erfragen, was die höchste ID ist, und die Sequence passend setzen (falls dem nicht so ist) und bei weiteren Inserts in die Tabelle die Spalte einfach nicht angeben.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

castorp
Erfahrener Benutzer
Beiträge: 1001
Registriert: Sa 27. Jun 2009, 22:24
Kontaktdaten:

Re: Anlegen neuen Datensatzes - doppelter Schlüsselwert verletzt Unique-Constraint

Beitrag von castorp » Di 18. Apr 2017, 15:50

Wenn die Spalte einen default hat, dann darfst Du sie beim Insert nicht angeben:

Code: Alles auswählen

insert into "Ärzte" ("aAnrede", "aTitel", "aNachname", ... ) values ('Herr',  'Dr', 'Müller-Lüdenscheid', ... );
Damit wird dann automatisch der Wert aus der Sequence genommen.
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

DrGonzo
Neuer Benutzer
Beiträge: 19
Registriert: Di 18. Apr 2017, 10:41

Re: Anlegen neuen Datensatzes - doppelter Schlüsselwert verletzt Unique-Constraint

Beitrag von DrGonzo » Di 18. Apr 2017, 16:13

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 :-)
Vielen Dank und freundliche Grüsse

Dr. Gonzo

Antworten