Fehlermeldung: Tabelle ist nicht eindeutig indiziert



  • Hallo,

    ich habe eine Tabelle in MySQL mit zwei foreign keys und zwei indizes. In der Tabelle sind drei Spalten - ein Counter, Kunden_ID, Listen_ID.

    Es kann jedem Kunden mehrere Listen zugeordnet werden, wobei jede Liste nur einmal einem Kunden zugeordnet werden dürfen. Entsprechend habe ich Indizes definiert und wenn ich über eine Administratino-Oberfläche Daten in die Tabelle eingebe, funktionieren die Indizes auch korrekt.

    Nun möchte ich aber über den C++ Builder einen Satz inserten, bekomme aber immer die Fehlermeldung - "Operation wird nicht unterstützt - Tabelle ist nicht eineutig indiziert." - was definitiv nicht richtig ist.
    Muss man da irgendwo noch eine Einstellung tätigen, damit es funktioniert?

    Die DDL für die Tabelle ist folgende:

    CREATE TABLE `tb_kd_sob_lst` (
    `Counter` int(5) unsigned NOT NULL auto_increment,
    `Kunden_ID` int(5) unsigned NOT NULL,
    `List_ID` int(5) unsigned NOT NULL,
    PRIMARY KEY (`Counter`),
    UNIQUE KEY `IX_KD_LISTS` (`Kunden_ID`,`List_ID`),
    KEY `FIC_LIST_ID` (`List_ID`),
    CONSTRAINT `FIC_KD_ID` FOREIGN KEY (`Kunden_ID`) REFERENCES `tb_kd_sob` (`Kunden_ID`) ON DELETE NO ACTION ON UPDATE NO ACTION,
    CONSTRAINT `FIC_LIST_ID` FOREIGN KEY (`List_ID`) REFERENCES `tb_list` (`List_ID`) ON DELETE NO ACTION ON UPDATE NO ACTION
    ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;

    Den zweiten Index FIC_LIST_ID legt er mir automatisch an, wenn ich dei foreign keys definiere.



  • Wieso verwendest Du eigentlich einen Surrogatschlüssel und bildest den Primärschlüssel nicht aus (Kunden_ID,List_ID)?



  • Beziehst du dich da auf den primary key (counter) ?

    den habe ich, weil ich dann direkt über eine eindeutige nummer auf die sätze zugreifen kann. kann man aber auch weglassen.

    Ich habe es gerade mal mit der Variante versucht aber tut erst recht nicht:

    CREATE TABLE `tb_kd_sob_lst` (
    `Kunden_ID` int(5) unsigned NOT NULL,
    `List_ID` int(5) unsigned NOT NULL,
    PRIMARY KEY USING BTREE (`Kunden_ID`,`List_ID`),
    UNIQUE KEY `IX_KD_LISTS` (`Kunden_ID`,`List_ID`),
    KEY `FIC_LIST_ID` (`List_ID`),
    CONSTRAINT `FIC_KD_ID` FOREIGN KEY (`Kunden_ID`) REFERENCES `tb_kd_sob` (`Kunden_ID`) ON DELETE NO ACTION ON UPDATE NO ACTION,
    CONSTRAINT `FIC_LIST_ID` FOREIGN KEY (`List_ID`) REFERENCES `tb_list` (`List_ID`) ON DELETE NO ACTION ON UPDATE NO ACTION
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    Nein, die Definitionen waren ok. Wie schon gesagt, das Funktioniert auch alles über die Admin Oberfläche.



  • Dann würde ich das jetzt step by step aufbauen: Eine Tabelle, Primkey int(5) einfügen, Prüfen, ob das Insert geht, Fremdschlüsselspalten dran, wieder prüfen, Fremdschlüsselbeziehungen dran, wieder prüfen...



  • mhh, nun ich habe die Tabelle ohne foreign keys und ohne indizes nur noch mit einem primary key auf den Counter. Aber die Fehlermeldung kommt immer noch.

    Aber wie ja auch schon shrieb, sind die definitionen der foreign keys und der indizes korrekt.

    das problem liegt bei c++ builder bzw. beim source code.

    nur ich weiss nicht wo.



  • zeig doch einfach mal das Insert-Kommando



  • also ich hbe es mit zwei Methoden versucht:

    FM_DM_Main->tb_kd_sob_list->Insert();
    FM_DM_Main->tb_kd_sob_list->FieldByName("Kunden_ID")->Value = Kunden_Nr;
    FM_DM_Main->tb_kd_sob_list->FieldByName("List_ID")->Value = List_ID;
    FM_DM_Main->tb_kd_sob_list->Post();

    und die zweite:

    FM_DM_Main->tb_kd_sob_list->InsertRecord(OPENARRAY(TVarRec,((void*)NULL, Kunden_Nr, List_ID)));

    mit:

    int List_ID,
    Kunden_Nr;



  • im übrigen werden die Sätze geschrieben in die Tablee, nur es kommt diese Fehlermeldung und es wird eine Exception ausgelöst.



  • mit welchen Komponenten arbeitest du? TTable, TADOTable oder andere?



  • in diesem Fall nutze ich eine TTable, die auf eine MySQL Tabelle zugreift.



  • Die Fehlermeldung kommt von der BDE, vielleicht solltest du mal die ADO-Komponenten oder eine andere Alternative (MySQL-Wrapper) verwenden, da die BDE veraltet ist und nicht weiterentwickelt wird.



  • nun habe ich die verbindung über eine TADOConnection und TADOTable hergestellt und der INSERT bringt die gleiche Fehlermeldung.

    Wie auch bei den BDE Komponenten kommt die Fehlermeldung aber der INSERT geht durch.

    Wenn ich den INSERT über eine SQL INSERT Statement der MySQL Admin Oberfläche absetze geht alles ohne Porbleme.

    Das Problem könnte auch bei der ODBC Schnittstelle liegen, oder ?


Log in to reply