MySQL/InnoDB: Grund für den Spaltenindex in der Tabelle beim Hinzufügen (und Löschen) einer FK-Einschränkung [Duplikat]
Posted: 13 Jan 2025, 19:28
Beim Erstellen einer einfachen Fremdschlüsseleinschränkung (FK) zwischen zwei Tabellen wird manchmal ein Index mit dem Namen der erstellten Einschränkung für die Tabelle generiert.
Kann mir jemand etwas Einblick geben? Was macht dieser Index eigentlich technisch und unter welchen Bedingungen wird er erstellt? Denn anscheinend
Hinzufügen der folgenden Einschränkung:
Erstellt eine aktive Einschränkung korrekt, wie sie in der Beziehungsansicht dieser Tabelle in phpMyAdmin angezeigt wird:

und es ist auch im Einschränkungskatalog von INFORMATION_SCHEMA.TABLE_CONSTRAINTS aufgeführt:

Der betreffende Index liegt auf dem Tisch selbst, indiziert die Spalte mit der Einschränkung und verwendet denselben Namen wie die erstellte Einschränkung:

Dieser Index kann gelöscht werden, ohne dass dies Auswirkungen auf das Vorhandensein oder die Funktionsweise der Einschränkung hat. Es scheint also keine eigene Funktionalität zu haben.
Aufhebung der Einschränkung
lässt den Tabellenindex nachgestellt, was möglicherweise darauf hindeutet, dass eine aktive FK-Einschränkung vorliegt, obwohl dies nicht der Fall ist.
Hinweis: Betreff -Das Hinzufügen der Einschränkung mit dem vorherigen Namen funktioniert einwandfrei und führt zu keiner Kollision oder einem Duplikat des Index.
Irgendwelche Erkenntnisse darüber, warum ADD CONSTRAINT dies tut?
Kann mir jemand etwas Einblick geben? Was macht dieser Index eigentlich technisch und unter welchen Bedingungen wird er erstellt? Denn anscheinend
- es kann gelöscht werden, ohne dass sich dies auf die aktive Einschränkung auswirkt.
- es bleibt auch nach dem Löschen in der Tabelle Einschränkung.
Code: Select all
CREATE TABLE `customers` (
`customerId` int(10) UNSIGNED NOT NULL,
`customerName` varchar(255) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
ALTER TABLE `customers` ADD PRIMARY KEY (`customerId`);
CREATE TABLE `orders` (
`orderId` int(10) UNSIGNED NOT NULL,
`orderCustomerId` int(10) UNSIGNED NOT NULL,
`orderName` varchar(255) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
ALTER TABLE `orders` ADD PRIMARY KEY (`orderId`);
Code: Select all
ALTER TABLE `orders`
ADD CONSTRAINT `orders.orderCustomerId__customers.customerId_FK` FOREIGN KEY (`orderCustomerId`) REFERENCES `customers` (`customerId`) ON DELETE RESTRICT ON UPDATE RESTRICT;

und es ist auch im Einschränkungskatalog von INFORMATION_SCHEMA.TABLE_CONSTRAINTS aufgeführt:

Der betreffende Index liegt auf dem Tisch selbst, indiziert die Spalte mit der Einschränkung und verwendet denselben Namen wie die erstellte Einschränkung:

Dieser Index kann gelöscht werden, ohne dass dies Auswirkungen auf das Vorhandensein oder die Funktionsweise der Einschränkung hat. Es scheint also keine eigene Funktionalität zu haben.
Aufhebung der Einschränkung
Code: Select all
ALTER TABLE `orders` DROP FOREIGN KEY `orders.orderCustomerId__customers.customerId_FK`;
Hinweis: Betreff -Das Hinzufügen der Einschränkung mit dem vorherigen Namen funktioniert einwandfrei und führt zu keiner Kollision oder einem Duplikat des Index.
Irgendwelche Erkenntnisse darüber, warum ADD CONSTRAINT dies tut?