ConstraintException bei primärem Kombinationsschlüssel

01/04/2009 - 14:43 von Lars Dröge | Report spam
Hallo,

in meiner Datenbank wirft Visual Studio 2005 eine ConstraintException, wenn
ein Teil des primàren Kombinationsschlüssels doppelt in einer Tabelle
vorkommt. Da die Kombination selbst einmalig ist, erwarte ich aber keine
Exception. Nun habe ich zwei Fragen:

1. Habe ich falsche Erwartungen an primàre Kombinationsschlüssel oder
verhàlt sich VS2005 hier falsch?
2. Wie kann ich anderweitig sicher stellen, dass jede Kombination eindeutig
ist, aber die Teile des Kombinationsschlüssels mehrdeutig seien dürfen?

Zur Veranschauung habe ich mein Problem im kleinen nachgebildet:
Es gibt drei involvierte Tabellen, nennen wir sie A, B und H. Tabelle H ist
eine Hilfstabelle für eine m:n Beziehung zwischen A und B.


[Tabelle A]
ID PK
other NULL

[Tabelle B]
ID IDENTITY PK
other NULL

[Tabelle H]
ID_A PK, FK -> A.ID
ID_B PK, FK -> B.ID


Beispieldaten:

[Tabelle A] [Tabelle B]
ID ID
12345 1
56010 2

[Tabelle H]
ID_A ID_B
-
12345 1
12345 2 <<- Exception


Danke im Voraus.
MfG
Lars
 

Lesen sie die antworten

#1 Elmar Boye
01/04/2009 - 17:19 | Warnen spam
Hallo Lars,

Lars Dröge schrieb:
in meiner Datenbank wirft Visual Studio 2005 eine ConstraintException, wenn
ein Teil des primàren Kombinationsschlüssels doppelt in einer Tabelle
vorkommt. Da die Kombination selbst einmalig ist, erwarte ich aber keine
Exception. Nun habe ich zwei Fragen:

1. Habe ich falsche Erwartungen an primàre Kombinationsschlüssel oder
verhàlt sich VS2005 hier falsch?
2. Wie kann ich anderweitig sicher stellen, dass jede Kombination eindeutig
ist, aber die Teile des Kombinationsschlüssels mehrdeutig seien dürfen?



Weder 1 noch 2, ich vermute eher, Du hast die Fremdschlüssel anders
angegeben als beabsichtigt.

Zur Veranschauung habe ich mein Problem im kleinen nachgebildet:

Es gibt drei involvierte Tabellen, nennen wir sie A, B und H. Tabelle H ist
eine Hilfstabelle für eine m:n Beziehung zwischen A und B.



So funktioniert es (H heisst hier AB).

DataSet dataSet = new DataSet();

DataTable tableA = dataSet.Tables.Add("TabelleA");
tableA.Columns.Add("ID", typeof(int));
tableA.Columns.Add("Daten", typeof(string));
tableA.Constraints.Add("PK_TabelleA", tableA.Columns["ID"], true);

DataTable tableB = dataSet.Tables.Add("TabelleB");
tableB.Columns.Add("ID", typeof(int));
tableB.Columns.Add("Daten", typeof(string));
tableB.Constraints.Add("PK_TabelleB", tableB.Columns["ID"], true);

DataTable tableAB = dataSet.Tables.Add("TabelleAB");
tableAB.Columns.Add("ID_A", typeof(int));
tableAB.Columns.Add("ID_B", typeof(int));
tableAB.Columns.Add("Daten", typeof(string));
tableAB.Constraints.Add("PK_TabelleAB",
new DataColumn[] { tableAB.Columns["ID_A"], tableAB.Columns["ID_B"] },
true);

// Referentielle Integritàt für die Spalten
tableAB.Constraints.Add("FK_TabelleAB_TabelleA",
tableA.Columns["ID"],
tableAB.Columns["ID_A"]);
tableAB.Constraints.Add("FK_TabelleAB_TabelleB",
tableB.Columns["ID"],
tableAB.Columns["ID_B"]);

tableA.Rows.Add(1, "Zeile 1 Tabelle A");
tableA.Rows.Add(2, "Zeile 2 Tabelle A");
tableA.AcceptChanges();

tableB.Rows.Add(1000, "Zeile 1000 Tabelle B");
tableB.Rows.Add(2000, "Zeile 2000 Tabelle B");
tableB.AcceptChanges();

tableAB.Rows.Add(1, 1000, "1 mit 1000");
tableAB.Rows.Add(2, 1000, "2 mit 1000");

tableAB.Rows.Add(1, 2000, "1 mit 2000");
tableAB.Rows.Add(2, 2000, "1 mit 2000");
tableAB.AcceptChanges();

// Aua...
tableAB.Rows.Add(1, 1000, "1 mit 1000");
tableAB.Rows.Add(1, 3000, "1 mit 3000");

Gruß Elmar

Ähnliche fragen