# [SQL] Unique Constraint



## Evolver (6. Okt 2007)

Ich habe nun eine SQL-Problem und ich kann die Lösung einfach nicht finden. Es etwas umfangreich, aber es wäre schön, wenn es sich trotzdem mal jemand ansehen könnte. Ich habe 3 Tabellen,die zusammenhängen, und immer wenn ich Elemente (bestehend aus einem Eintrag pro Tabelle) einfügen will erhalte ich Meldungen, dass UniqueConstraints verletzt sind.

Die Tabellen sind wie folgt definiert:

```
CREATE TABLE  "UMLMDEPENDENCY" 
   (	"VERSION" NUMBER(20,0), 
	"ID" VARCHAR2(255), 
	"STATUS" VARCHAR2(6) NOT NULL ENABLE, 
	"EDITOR" VARCHAR2(20), 
	"EDIT_DATE" TIMESTAMP (6), 
	"NAME" VARCHAR2(255), 
	"VISIBILITY" VARCHAR2(9), 
	"DBTYPE" VARCHAR2(30) NOT NULL ENABLE, 
	"ROLENAME" VARCHAR2(255), 
	"IDPARENT" VARCHAR2(255) NOT NULL ENABLE, 
	"VERSIONPARENT" NUMBER(20,0) NOT NULL ENABLE, 
	"MAPPINGKEY" NUMBER(20,0), 
	 CHECK (status IN ('INSERT','CHANGE', 'DELETE')) ENABLE, 
	 CHECK (visibility IN ('public', 'protected', 'private', 'package')) ENABLE, 
	 CHECK (dbType IN ('Dependency', 'Usage', 'Abstraction', 'Realization', 'Substitution', 'InterfaceRealization')) ENABLE, 
	 CONSTRAINT "UMLMDEPENDENCY_KEY" PRIMARY KEY ("VERSION", "ID") ENABLE, 
	 CONSTRAINT "UMLMDEPENDENCY_MK" FOREIGN KEY ("MAPPINGKEY")
	  REFERENCES  "UMLMOPAQUEEXPRESSION" ("TABLEKEY") ENABLE, 
	 CONSTRAINT "UMLMDEPENDENCY_PK" FOREIGN KEY ("VERSIONPARENT", "IDPARENT")
	  REFERENCES  "UMLMPACKAGE" ("VERSION", "ID") ENABLE, 
	 CONSTRAINT "UMLMDEPENDENCY_V" FOREIGN KEY ("VERSION")
	  REFERENCES  "VERSIONEN" ("TABLEKEY") ENABLE
   )


CREATE TABLE  "UMLMDEPENDENCYCLIENT" 
   (	"TABLEKEY" NUMBER(20,0), 
	"EDITOR" VARCHAR2(20), 
	"EDIT_DATE" TIMESTAMP (6), 
	"CLIENTID" VARCHAR2(255) NOT NULL ENABLE, 
	"CLIENTVERSION" NUMBER(20,0) NOT NULL ENABLE, 
	"CLIENTTABLENAME" VARCHAR2(255) NOT NULL ENABLE, 
	"DEPENDENCYID" VARCHAR2(255) NOT NULL ENABLE, 
	"DEPENDENCYVERSION" NUMBER(20,0) NOT NULL ENABLE, 
	 PRIMARY KEY ("TABLEKEY") ENABLE, 
	 CONSTRAINT "UMLMDEPENDENCYCLIENT_DK" FOREIGN KEY ("DEPENDENCYVERSION", "DEPENDENCYID")
	  REFERENCES  "UMLMDEPENDENCY" ("VERSION", "ID") ENABLE
   )



CREATE TABLE  "UMLMDEPENDENCYSUPPLIER" 
   (	"TABLEKEY" NUMBER(20,0), 
	"EDITOR" VARCHAR2(20), 
	"EDIT_DATE" TIMESTAMP (6), 
	"SUPPLIERID" VARCHAR2(255) NOT NULL ENABLE, 
	"SUPPLIERVERSION" NUMBER(20,0) NOT NULL ENABLE, 
	"SUPPLIERTABLENAME" VARCHAR2(255) NOT NULL ENABLE, 
	"DEPENDENCYID" VARCHAR2(255) NOT NULL ENABLE, 
	"DEPENDENCYVERSION" NUMBER(20,0) NOT NULL ENABLE, 
	 PRIMARY KEY ("TABLEKEY") ENABLE, 
	 CONSTRAINT "UMLMDEPENDENCYSUPPLIER_DK" FOREIGN KEY ("DEPENDENCYVERSION", "DEPENDENCYID")
	  REFERENCES  "UMLMDEPENDENCY" ("VERSION", "ID") ENABLE
   )
```

Das Ganze stellte eine Bezeihung dar und Client und Supplier sind deren "Mitglieder". Nun will ich eine Beziehung einfügen:

```
INSERT INTO umlmdependency (version, id, status, editor, edit_date, name, visibility, dbtype, rolename, idparent, versionparent, mappingkey)
VALUES (9, '-4d4c86dd:11575884e99:-7fa6', 'INSERT', 'BA', TO_TIMESTAMP_TZ('2007-10-06 15:37:45.89', 'YYYY-MM-DD HH24:MI:SS.FF'), null, 'public', 'InterfaceRealization', 'ownedMember', '-4d4c86dd:11575884e99:-7ff4', 9, null)

INSERT INTO umlmdependencysupplier (tablekey, editor, edit_date, supplierid, supplierversion, suppliertablename, dependencyid, dependencyversion)
VALUES (3, 'BA', TO_TIMESTAMP_TZ('2007-10-06 15:37:46.468', 'YYYY-MM-DD HH24:MI:SS.FF'), '-4d4c86dd:11575884e99:-7fa7', 9, 'UMLMClassifier', '-4d4c86dd:11575884e99:-7fa6', 9)

INSERT INTO umlmdependencyclient (tablekey, editor, edit_date, clientid, clientversion, clienttablename, dependencyid, dependencyversion)
VALUES (3, 'BA', TO_TIMESTAMP_TZ('2007-10-06 15:37:48.765', 'YYYY-MM-DD HH24:MI:SS.FF'), '-4d4c86dd:11575884e99:-7faa', 9, 'UMLMClassifier', '-4d4c86dd:11575884e99:-7fa6', 9)
```

Aber für den Client und den Supplier erhalte ich die Fehlermeldung, ein Unique Constraint sei verletzt oder so. Ich kann auch nach intensiver Suche den Fehler nicht finden. Bitte helft mir!


----------



## Guest (6. Okt 2007)

Existiert bereits ein Datensatz mit TABLEKEY = 3?


----------



## Evolver (6. Okt 2007)

Nein.


----------



## Guest (6. Okt 2007)

Ich habe es etwas modifiziert in einer H2 Datenbank angelegt (die FKs der nicht existierenden Tabellen entfernt und 
die Timestamp-Konvertierung an die Syntax von H2 angepasst) und die drei Datensätze eingefügt. Keine Probleme.
Die Ursache muss also an bereits bestehenden Daten liegen. Prüfe auch die Constraints der FKs, ob da nicht irgendwo 
per Default 'unique' angelegt wurde. Wenn eine Constraint-Verletzung vorliegt, sollte die Fehlermeldung die Id/Bezeichnung 
des Constraints enthalten, welches die Ursache ist.


----------



## Evolver (7. Okt 2007)

Ganz selbststicher habe ich gestern behauptet, es läge nicht am Tablekey. Schließlich erzeuge ich den mit einer altbewährten Funktion, die auch in anderen Tabllen ihren Dienst tut. Heute habe ich dann festgestellt, dass ich den Tyblekey aus der falschen Tabelle geholt habe, darum kam es zu Überschneidungen.

@Gast: Danke für die Mühe.


----------

