doppelter Schlüsselwert im zus.gesetzten Primärschlüssel beim Einfügen neuer Zeilen

Fragen und Probleme rund um die Abfragespache SQL.
Zwicke85
Neuer Benutzer
Beiträge: 3
Registriert: Do 20. Okt 2011, 12:06

doppelter Schlüsselwert im zus.gesetzten Primärschlüssel beim Einfügen neuer Zeilen

Beitragvon Zwicke85 » Do 20. Okt 2011, 13:34

Hallo liebe Forengemeinde,

ich habe ein Problem beim Einfügen von Datensätzen in eine Tabelle mit einem zusammengesetzten Primärschlüssel.
Dabei wird mir der Fehler „doppelter Schlüsselwert verletzt Unique-Constraint <…>“ angezeigt, obwohl einer der beiden Schlüssel-Attribute definitiv einen neuen Wert aufweist.

Am besten erkläre ich das nochmal an einem konkreten vereinfachten Beispiel:

Es existiert eine Tabelle mit der Information, wann ein Semester an einer Hochschule beginnt und endet. Sie weist u.a. folgende 4 Spalten auf:
Institution Semester Beginn Ende
Der Primärschlüssel besteht also aus den Spalten Hochschule und Semester.
Ferner ist (natürlich) eingestellt, dass diese beiden Spalten nicht null sein dürfen und der Pimärschlüssel aus eben diesen beiden Spalten besteht. Weitere Merkmale weist die Tabelle aktuell nicht auf.

Nun müssen die Werte für das aktuelle Semester (Wintersemester 2011) zu allen bisher vorhandenen Einrichtungen eingefügt werden. Allerdings gilt zunächst die Annahme, dass alle Institutionen die gleichen Start- und Endtermine aufweisen (Zunächst benötige ich die Tabelle für Test-Zwecke).

Bsp:
TU Chemnitz WS11 01.10.2011 31.03.2012


Dies wollte ich mit folgendem Statement ausführen:
INSERT INTO dim_semester_institution (institution, semester, begin_semester, end_semester)
SELECT DISTINCT institution, 'WS 11', '2011-10-01'::date, '2012-03-31'::date FROM dim_semester_institution

Da bisher keine Werte zum WS 11 vorliegen, verstehe ich nicht warum ich den o.g. Fehler wegen „doppelter Werte im Primärschlüssel“ erhalte.
Merkwürdig ist außerdem, dass sich ein einzelner Beispiel-Datensatz über ein <Insert Into … VALUES…> einfügen lässt.

Ferner hatte ich bereits eine zweite Tabelle verwendet, um an die Auswahl der Einrichtungen zu gelangen. Auch hier hatte ich den gleichen Fehler erhalten.

Ich wäre für ein paar Vorschläge oder Hinweise sehr dankbar. Vielleicht habe ich auch einfach nur etwas in der Tabellendefinition vergessen?

Freundliche Grüße
Antje

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

Beitragvon akretschmer » Do 20. Okt 2011, 14:23

Zwicke85 hat geschrieben:Hallo liebe Forengemeinde,

ich habe ein Problem beim Einfügen von Datensätzen in eine Tabelle mit einem zusammengesetzten Primärschlüssel.
Dabei wird mir der Fehler „doppelter Schlüsselwert verletzt Unique-Constraint <…>“ angezeigt, obwohl einer der beiden Schlüssel-Attribute definitiv einen neuen Wert aufweist.

Am besten erkläre ich das nochmal an einem konkreten vereinfachten Beispiel:

Es existiert eine Tabelle mit der Information, wann ein Semester an einer Hochschule beginnt und endet. Sie weist u.a. folgende 4 Spalten auf:
Institution Semester Beginn Ende
Der Primärschlüssel besteht also aus den Spalten Hochschule und Semester.
Ferner ist (natürlich) eingestellt, dass diese beiden Spalten nicht null sein dürfen und der Pimärschlüssel aus eben diesen beiden Spalten besteht. Weitere Merkmale weist die Tabelle aktuell nicht auf.

Nun müssen die Werte für das aktuelle Semester (Wintersemester 2011) zu allen bisher vorhandenen Einrichtungen eingefügt werden. Allerdings gilt zunächst die Annahme, dass alle Institutionen die gleichen Start- und Endtermine aufweisen (Zunächst benötige ich die Tabelle für Test-Zwecke).

Bsp:
TU Chemnitz WS11 01.10.2011 31.03.2012


Dies wollte ich mit folgendem Statement ausführen:
INSERT INTO dim_semester_institution (institution, semester, begin_semester, end_semester)
SELECT DISTINCT institution, 'WS 11', '2011-10-01'::date, '2012-03-31'::date FROM dim_semester_institution

Da bisher keine Werte zum WS 11 vorliegen, verstehe ich nicht warum ich den o.g. Fehler wegen „doppelter Werte im Primärschlüssel“ erhalte.
Merkwürdig ist außerdem, dass sich ein einzelner Beispiel-Datensatz über ein <Insert Into … VALUES…> einfügen lässt.

Ferner hatte ich bereits eine zweite Tabelle verwendet, um an die Auswahl der Einrichtungen zu gelangen. Auch hier hatte ich den gleichen Fehler erhalten.

Ich wäre für ein paar Vorschläge oder Hinweise sehr dankbar. Vielleicht habe ich auch einfach nur etwas in der Tabellendefinition vergessen?

Freundliche Grüße
Antje


- was steht in der Zieltabelle alles schon drin?
- was liefert ein "SELECT DISTINCT institution, 'WS 11', '2011-10-01'::date, '2012-03-31'::date FROM dim_semester_institution"

Dein "Merkwürdig ist außerdem, dass sich ein einzelner Beispiel-Datensatz über ein <Insert Into … VALUES…> einfügen lässt." ist nicht merkwürdig, sondern gewolltes Verhalten.


Andreas
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Zwicke85
Neuer Benutzer
Beiträge: 3
Registriert: Do 20. Okt 2011, 12:06

Beitragvon Zwicke85 » Do 20. Okt 2011, 14:51

Hallo Andreas,

also bisher stehen die Datensätze für die letzten beiden Semester drin:

Tabelle dim_semester_institution
Institution Semester Beginn Ende
TU Chemnitz WS10 01.10.2010 31.03.2011
TU Chemnitz SS11 01.04.2011 30.09.2011
...
(also dies wiederholt für mehrere Institutionen)

Und nun soll zu jeder Einrichtung (daher Distinct institution) ein neuer Datensatz eingefügt werden, der die Information zum WS11 (Wintersemester 2011) beinhaltet:

TU Chemnitz WS11 01.10.2011 31.03.2012
TU Dresden WS11 01.10.2011 31.03.2012
...

Natürlich weiß ich, dass man einzelne Datensätze über ein <Insert Into ... Values...> einfügt.
Ich wollte damit nur verdeutlichen, dass ein einzelner Datensatz eingefügt werden kann, mein beschriebenes Statement für mehrere Zeilen allerdings leider nicht funktioniert:

INSERT INTO dim_semester_institution (institution, semester, begin_semester, end_semester)
SELECT DISTINCT institution, 'WS 11', '2011-10-01'::date, '2012-03-31'::date FROM dim_semester_institution

Vielleicht hilft nun diese Verdeutlichung, um eine Lösung des Problems zu errreichen...

Vielen Dank für Eure Hilfe vorab.

Freundliche Grüße
Antje

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

Beitragvon akretschmer » Do 20. Okt 2011, 15:34

Zwicke85 hat geschrieben:Hallo Andreas,

also bisher stehen die Datensätze für die letzten beiden Semester drin:

Tabelle dim_semester_institution
Institution Semester Beginn Ende
TU Chemnitz WS10 01.10.2010 31.03.2011
TU Chemnitz SS11 01.04.2011 30.09.2011
...
(also dies wiederholt für mehrere Institutionen)

Und nun soll zu jeder Einrichtung (daher Distinct institution) ein neuer Datensatz eingefügt werden, der die Information zum WS11 (Wintersemester 2011) beinhaltet:

TU Chemnitz WS11 01.10.2011 31.03.2012
TU Dresden WS11 01.10.2011 31.03.2012
...

Natürlich weiß ich, dass man einzelne Datensätze über ein <Insert Into ... Values...> einfügt.
Ich wollte damit nur verdeutlichen, dass ein einzelner Datensatz eingefügt werden kann, mein beschriebenes Statement für mehrere Zeilen allerdings leider nicht funktioniert:

INSERT INTO dim_semester_institution (institution, semester, begin_semester, end_semester)
SELECT DISTINCT institution, 'WS 11', '2011-10-01'::date, '2012-03-31'::date FROM dim_semester_institution

Vielleicht hilft nun diese Verdeutlichung, um eine Lösung des Problems zu errreichen...

Vielen Dank für Eure Hilfe vorab.

Freundliche Grüße
Antje


Kannst Du das mal auf eine kleine Beispieltabelle mit konkreten Anweisungen (CREATE TABLE, INSERT ...) demonstrieren?


Andreas
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Zwicke85
Neuer Benutzer
Beiträge: 3
Registriert: Do 20. Okt 2011, 12:06

Beitragvon Zwicke85 » Do 20. Okt 2011, 17:06

Hallo,

ich habe nun die Lösung.
Beim Testen des vereinfachten Beispiels funktionierte das <Insert Into... Select> auf einmal.

Daher habe ich mir nochmal meine Original-Query (mit weiteren Attributen) angesehen: Ich hatte das Distinct vergessen (Erst hatte ich es mitten in der Attributs-Liste, was natürlich einen Syntax-Fehler verursachte. Daraufhin hatte ich es nur entfernt und nicht an den Anfang des Selects gestellt...). Daher ist nat�rlich klar, dass doppelte Werte durch das Attribut institution auftauchten.

Dennoch vielen Dank für deine Mühe Andreas. Letztlich hat dein Verweis auf ein konkretes Statement-Beispiel mir zur Lösung verholfen :D

Freundliche Grüße
Antje


Zurück zu „SQL“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste