Loeschen von mehreren Indizes

Papp Nase

Aktiver Benutzer
Beiträge
48
Hallo!

Mit dem Befehl

Code:
 SHOW INDEX FROM futtermengen

kann ich mir alle Indizes anschauen, die in der Tabelle angelegt wurden, falls welche vorhanden sind.

Ich kann mit folgendem Befehl Indizes wieder löschen:

Code:
 DROP INDEX PRIMARY ON futtermengen

Angenommen, ich habe jetzt einen PRIMARY-Key definiert und gesagt, dass noch weitere Spalten indiziert werden sollen, ggf. sogar aus versehen mehrmals einen Index erstellt habe (der dann mit _XXX ergänzt wurde) - wie kann ich alle Indizes einer Tabelle auf einen Rutsch löschen?

Code:
 DROP INDEX * ON futtermengen
funktioniert bei mir nicht. Ich musste zum Entfernen jeden Index einzeln löschen. Gibt es eine Möglichkeit, dass es alles auf einmal geht?
 
Werbung:
Ich musste zum Entfernen jeden Index einzeln löschen. Gibt es eine Möglichkeit, dass es alles auf einmal geht?

So weit ich weiß geht das nicht. Sollten viele Constraints gelöscht werden bietet es sich an die Tabelle neu zu erstellen und die Daten einfach zu kopieren.

Bei gleicher Datenstruktur geht das ganz einfach:
Code:
INSERT INTO [table_neu] (
  SELECT * FROM [table_alt]
  )
 
Werbung:
Angenommen, ich habe jetzt einen PRIMARY-Key definiert und gesagt, dass noch weitere Spalten indiziert werden sollen, ggf. sogar aus versehen mehrmals einen Index erstellt habe (der dann mit _XXX ergänzt wurde) - wie kann ich alle Indizes einer Tabelle auf einen Rutsch löschen?

Code:
 DROP INDEX * ON futtermengen
funktioniert bei mir nicht. Ich musste zum Entfernen jeden Index einzeln löschen. Gibt es eine Möglichkeit, dass es alles auf einmal geht?

Nein. Dazu müßtest in den Katalogen die Indexe ermitteln und die DROP-Anweisungen dynamisch ermitteln. Falls das Indexe für Primary Keys sind, müßte einklich vorher auch noch der Constraint gelöscht werden (analog zu anderen Constraints, die dafür einen Index nutzen).

Vermutlich ist MySQL aber zu blöd zu erkennen, wo es Abhängigkeiten gibt, in PG wäre dies dann so:

Code:
test=# create table m(id int primary key);
CREATE TABLE
Time: 157,206 ms
test=*# create table s ( m_id int references m);
CREATE TABLE
Time: 32,962 ms
test=*# \d m
  Table "public.m"
 Column |  Type  | Modifiers
--------+---------+-----------
 id  | integer | not null
Indexes:
  "m_pkey" PRIMARY KEY, btree (id)
Referenced by:
  TABLE "s" CONSTRAINT "s_m_id_fkey" FOREIGN KEY (m_id) REFERENCES m(id)

test=*# drop index m_pkey;
ERROR:  cannot drop index m_pkey because constraint m_pkey on table m requires it
HINT:  You can drop constraint m_pkey on table m instead.

PG kennt halt die Abhängigkeiten aller Objekte untereinander. In MySQL sehe ich regelmäßig z.B. Probleme beim Backup, wenn Kunden einen View auf einer Tabelle anlegen und dann die Tabelle löschen. Geht - nur das Backup geht dann nicht mehr. Der Begriff 'Müll' ist für MySQL meiner Meinung nach verharmlosend.

Der Vorschlag von @Hony% geht nur bedingt: bei der Aktion gehen Indexe und Fremdschlüssel kapott. Das mit beachten.
 
Zurück
Oben