Frage

Ich bin mit MySQL und ich habe eine Tabelle mit einem Index, der als Fremdschlüssel in vielen anderen Tabellen verwendet wird. Ich mag den Datentyp des Index ändern (von zu unsigned integer unterzeichnet), was ist der beste Weg, dies zu tun?

Ich habe versucht, den Datentyp auf dem Indexfeld zu verändern, aber das scheitert, weil es als Fremdschlüssel für andere Tabellen verwendet wird. Ich habe versucht, den Datentyp auf einem des Fremdschlüssels zu verändern, aber das schlug fehl, weil es nicht den Datentyp des Index überein.

Ich nehme an, dass ich manuell alle der Fremdschlüssel-Constraints fallen könnte, die Datentypen ändern und die Einschränkungen wieder hinzufügen, aber dies würde eine Menge Arbeit sein, weil ich eine Menge von Tabellen mit diesem Index als Fremdschlüssel habe. Gibt es eine Möglichkeit für Fremdschlüssel vorübergehend auszuschalten, während eine Änderung vornehmen? Auch ist es eine Möglichkeit, eine Liste aller Felder Referenzierung des Index als Fremdschlüssel zu bekommen?

Update: Ich habe versucht, Modifizieren der ein Fremdschlüssel nach Fremdschlüsselprüfungen ausgeschaltet, aber es scheint nicht, die Kontrollen ausgeschaltet werden:

SET foreign_key_checks = 0;

ALTER TABLE `escolaterrafir`.`t23_aluno` MODIFY COLUMN `a21_saida_id` INTEGER DEFAULT NULL;

Hier ist der Fehler:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
090506 11:57:34 Error in foreign key constraint of table escolaterrafir/t23_aluno:
there is no index in the table which would contain
the columns as the first columns, or the data types in the
table do not match to the ones in the referenced table
or one of the ON ... SET NULL columns is declared NOT NULL. Constraint:
,
  CONSTRAINT FK_t23_aluno_8 FOREIGN KEY (a21_saida_id) REFERENCES t21_turma (A21_ID)

Definition der Indextabelle:

DROP TABLE IF EXISTS `escolaterrafir`.`t21_turma`;
CREATE TABLE  `escolaterrafir`.`t21_turma` (
  `A21_ID` int(10) unsigned NOT NULL auto_increment,
  ...
) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=latin1;

und die Tabelle, die den Fremdschlüssel hat, die er zeigt:

DROP TABLE IF EXISTS `escolaterrafir`.`t23_aluno`;
CREATE TABLE  `escolaterrafir`.`t23_aluno` (
  ...
  `a21_saida_id` int(10) unsigned default NULL,
  ...
  KEY `Index_7` (`a23_id_pedagogica`),
  ...
  CONSTRAINT `FK_t23_aluno_8` FOREIGN KEY (`a21_saida_id`) REFERENCES `t21_turma` (`A21_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=387 DEFAULT CHARSET=latin1;
War es hilfreich?

Lösung 2

Um meine eigene Frage zu beantworten, ich konnte nicht eine einfachere Art und Weise entdecken, dies zu tun. Ich landete alle Fremdschlüssel-Constraints fallen, die Feldtypen ändern und dann das Hinzufügen alle Fremdschlüssel-Constraints zurück.

Wie R. Bemrose erwähnt, mit SET foreign_key_checks = 0; hilft nur beim Hinzufügen oder Ändern von Daten, erlaubt aber nicht ALTER TABLE Befehle, die Fremdschlüssel-Constraints brechen würde.

Andere Tipps

Hier ist mein kleiner Beitrag zu diesem Thema. Dank Daniel Schneller für Inspiration und mir einen großen Teil der Lösung zu geben!

set group_concat_max_len = 2048;
set @table_name = "YourTableName";
set @change = "bigint unsigned";
select distinct table_name,
       column_name,
       constraint_name,
       referenced_table_name,
       referenced_column_name,
       CONCAT(
           GROUP_CONCAT('ALTER TABLE ',table_name,' DROP FOREIGN KEY ',constraint_name SEPARATOR ';'),
           ';',
           GROUP_CONCAT('ALTER TABLE `',table_name,'` CHANGE `',column_name,'` `',column_name,'` ',@change SEPARATOR ';'),
           ';',
           CONCAT('ALTER TABLE `',@table_name,'` CHANGE `',referenced_column_name,'` `',referenced_column_name,'` ',@change),
           ';',
           GROUP_CONCAT('ALTER TABLE `',table_name,'` ADD CONSTRAINT `',constraint_name,'` FOREIGN KEY(',column_name,') REFERENCES ',referenced_table_name,'(',referenced_column_name,')' SEPARATOR ';')
       ) as query
from   INFORMATION_SCHEMA.key_column_usage
where  referenced_table_name is not null
   and referenced_column_name is not null
   and referenced_table_name = @table_name
group by referenced_table_name

Mit dem @table_name Einstellung und @change Sie eine Abfrage generieren. @table_name sollte mit dem Primärschlüssel ein Tabellenname der Tabelle sein (es wird für die Tabellen sucht, die diese Spalte als Fremdschlüssel verwendet) und seine Art ändern, um @change.

Ich hatte ein paar Tische, so zu ändern, so dass wie ein Charme. Ich habe gerade @table_name zu ändern und dann eine Abfrage durchführen.

Um über den Einsatz von Fremdschlüssel-Constraints herauszufinden, geben Sie die folgende Abfrage auf der INFORMATION_SCHEMA Datenbank:

select distinct table_name, 
       column_name, 
       constraint_name,  
       referenced_table_name, 
       referenced_column_name 
from   key_column_usage 
where  constraint_schema = 'XXX' 
   and referenced_table_name is not null 
   and referenced_column_name is not null;

Ersetzen XXX mit Ihrem Schemanamen. Dies wird Ihnen eine Liste von Tabellen und Spalten, die anderen Spalten als Fremdschlüssel beziehen.

Leider sind Schemaänderungen nicht transaktions, so dass ich fürchte, Sie werden in der Tat vorübergehend die foreign_key_checks für diesen Vorgang deaktivieren. Ich empfehle - wenn möglich - Verbindungen von jedem Kunden in dieser Phase zu verhindern, dass die Gefahr der zufälligen Untereinschränkungsverletzung zu minimieren

.

Wie für die Tasten selbst. Sie müssen auch gelöscht und neu erstellt werden, wenn Sie die Tabellendatentypen geändert haben

Sie können Fremdschlüssel vorübergehend deaktivieren, indem Sie

SET foreign_key_checks = 0;

und sie wieder zu aktivieren

SET foreign_key_checks = 1;

Ich denke, das Administratorrechte erfordert, weil es beabsichtigt, die Daten in die Datenbank zu importieren.

Bearbeiten : In Reaktion auf Ihre bearbeiten, es sieht aus wie es nur Einschränkungen für DML-Anweisungen deaktiviert (Einfügen, Aktualisieren, Löschen), aber nicht DDL-Anweisungen (alte Tabelle, fällt Tisch, etc ... ).

Wenn Sie die Datenbank stoppen können dann Dump-Tabellen in Textdatei versucht, Spalten Definition manuell zurück in der Datei und Import-Tabellen ändern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top