Problem hinzufügen Fremdschlüssel mithilfe von Alter Table mit vorhandenen MYSQL-Datenbank - können nicht hinzufügen! Hilfe!!!

Ich habe eine Produktions-Datenbank, wo ich Sie umbenannt haben mehrere Spalten, die Fremdschlüssel. Offensichtlich mysql macht dies eine echte Schmerzen zu tun, in meiner Erfahrung.

Meine Lösung war, fallen die Indizes und foreign keys, benennen Sie die id-Spalten, und dann erneut fügen Sie die Indizes und Fremdschlüssel.

Dies funktioniert gut auf mysql 5.1 unter windows für die Entwicklung der Datenbank.

Lief ich mein Skript für die migration auf meinem debian-server, der ist auch mit Hilfe von mysql 5.1, und es gibt die folgende Fehlermeldung:

mysql> ALTER TABLE `company_to_module`
    -> ADD CONSTRAINT `FK82977604FE40A062` FOREIGN KEY (`company_id`) REFERENCES `company` (`company_id`) ON DELETE RESTRICT ON UPDATE RESTRICT;
ERROR 1005 (HY000): Can't create table 'jobprep_production.#sql-44a5_76' (errno: 150)

Gibt es keine Werte in dieser Tabelle, die in Konflikt mit der foreign key-ich bin versucht, hinzuzufügen. Die Datenbank hat sich nicht verändert. Die foreign key vorhanden war, bevor... so sind die Daten in Ordnung ist. Lassen Sie nicht zu erwähnen, dass ich nahm die GLEICHE Datenbank, die ich auf dem server haben, und Sie wandert problemlos auf Windows. Aber diese gleichen foreign-key-Migrationen sind nicht dabei, auf Debian.

Die Säulen sind mit dem gleichen Typ BIGINT (20)

Die Namen haben in der Tat existieren in Ihrer jeweiligen Tabellen.

Den Tabellen sind innodb. Sie haben bereits Fremdschlüssel in anderen Spalten, wie es ist. Dies ist nicht eine neue Datenbank.

Kann ich nicht löschen von Tabellen, denn dies ist eine Produktions-Datenbank.

Den Tabellen in meiner Datenbank:

 CREATE TABLE `company_to_module` (
  `company_id` bigint(20) NOT NULL,
  `module_id` bigint(20) NOT NULL,
  KEY `FK8297760442C8F876` (`module_id`),
  KEY `FK82977604FE40A062` (`company_id`) USING BTREE,
  CONSTRAINT `FK8297760442C8F876` FOREIGN KEY (`module_id`) REFERENCES `module` (`module_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Und

Create Table: CREATE TABLE `company` (
  `company_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  `postal_code` varchar(255) DEFAULT NULL,
  `province_id` bigint(20) DEFAULT NULL,
  `phone_number` varchar(255) DEFAULT NULL,
  `is_enabled` bit(1) DEFAULT NULL,
  `director_id` bigint(20) DEFAULT NULL,
  `homepage_viewable` bit(1) NOT NULL DEFAULT b'1',
  `courses_created` int(10) NOT NULL DEFAULT '0',
  `header_background` varchar(25) DEFAULT '#172636',
  `display_name` varchar(25) DEFAULT '#ffffff',
  `tab_background` varchar(25) DEFAULT '#284767',
  `tab_text` varchar(25) DEFAULT '#ffffff',
  `hover_tab_background` varchar(25) DEFAULT '#284767',
  `hover_tab_text` varchar(25) DEFAULT '#f2e0bd',
  `selected_tab_background` varchar(25) DEFAULT '#f5f5f5',
  `selected_tab_text` varchar(25) DEFAULT '#172636',
  `hover_table_row_background` varchar(25) DEFAULT '#c0d2e4',
  `link` varchar(25) DEFAULT '#4e6c92',
  PRIMARY KEY (`company_id`),
  KEY `FK61AE555A71DF3E03` (`province_id`),
  KEY `FK61AE555AAC50C977` (`director_id`),
  CONSTRAINT `company_ibfk_1` FOREIGN KEY (`director_id`) REFERENCES `user_account` (`user_account_id`),
  CONSTRAINT `FK61AE555A71DF3E03` FOREIGN KEY (`province_id`) REFERENCES `province` (`province_id`)
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8

Hier ist die innodb-status:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
110415  3:14:34 Error in foreign key constraint of table jobprep_production/#sql-44a5_1bc:
 FOREIGN KEY (`company_id`) REFERENCES `company` (`company_id`) ON DELETE RESTRICT ON UPDATE RESTRICT:
Cannot resolve column name close to:
) ON DELETE RESTRICT ON UPDATE RESTRICT

Wenn ich versuche, und löschen Sie den index von 'company_to_module', bekomme ich diesen Fehler:

#1025 - Error on rename of './jobprep_production/#sql-44a5_23a' to './jobprep_production/company_to_module' (errno: 150) 

Hier sind meine innodb-Variablen:

+---------------------------------+------------------------+
| Variable_name                   | Value                  |
+---------------------------------+------------------------+
| innodb_adaptive_hash_index      | ON                     |
| innodb_additional_mem_pool_size | 1048576                |
| innodb_autoextend_increment     | 8                      |
| innodb_autoinc_lock_mode        | 1                      |
| innodb_buffer_pool_size         | 8388608                |
| innodb_checksums                | ON                     |
| innodb_commit_concurrency       | 0                      |
| innodb_concurrency_tickets      | 500                    |
| innodb_data_file_path           | ibdata1:10M:autoextend |
| innodb_data_home_dir            |                        |
| innodb_doublewrite              | ON                     |
| innodb_fast_shutdown            | 1                      |
| innodb_file_io_threads          | 4                      |
| innodb_file_per_table           | OFF                    |
| innodb_flush_log_at_trx_commit  | 1                      |
| innodb_flush_method             |                        |
| innodb_force_recovery           | 0                      |
| innodb_lock_wait_timeout        | 50                     |
| innodb_locks_unsafe_for_binlog  | OFF                    |
| innodb_log_buffer_size          | 1048576                |
| innodb_log_file_size            | 5242880                |
| innodb_log_files_in_group       | 2                      |
| innodb_log_group_home_dir       | ./                     |
| innodb_max_dirty_pages_pct      | 90                     |
| innodb_max_purge_lag            | 0                      |
| innodb_mirrored_log_groups      | 1                      |
| innodb_open_files               | 300                    |
| innodb_rollback_on_timeout      | OFF                    |
| innodb_stats_on_metadata        | ON                     |
| innodb_support_xa               | ON                     |
| innodb_sync_spin_loops          | 20                     |
| innodb_table_locks              | ON                     |
| innodb_thread_concurrency       | 8                      |
| innodb_thread_sleep_delay       | 10000                  |
+---------------------------------+------------------------+

Ich möchte auch hinzufügen, dass während ich war das spielen mit dem hinzufügen der Fremdschlüssel, mysql meine Datenbank beschädigt und zerstört es. Ich musste neu laden aus einer Sicherung erneut versuchen.

Helfen? :/

  • Sind beide Tabellen InnoDB geben?
  • Hat die company Tabelle über einen index auf company_id ?
  • Ich nehme an, dass deine Tabelle ist MyISAM (die Standardeinstellung, wenn Sie noch nicht chnaged die config) und ich denke, Sie können keine foreign key-Einschränkungen in MyISAM. Siehe die Beschreibung des CREATE TABLE company_to_module.
  • Wenn beide Tabellen leer sind, löschen Sie und neu erstellen Sie, die Wahl InnoDB als Motor. Man könnte auch hinzufügen, die FOREIGN KEY constraints in der Tabellen-Erstellung Skript(en).
  • danke für die Tipps. Beide Tabellen sind nicht leer - das ist eine Produktions-Datenbank. Ich muss Benutzer die alter table-Anweisung. Alle Tabellen sind innodb. In der Tat, es ist Fremdschlüssel auf diese Tabellen - es ist nicht wie diese sind die ersten. Diese Datenbank hat 40 Tische Tonnen von Fremdschlüsseln in Tabellen. Also ich glaube nicht, dass es alle diese Probleme 🙁 Und ja, die Firma hat die id "company_id". Ich war mir sicher, das zu tun. Die Anwendung funktioniert eigentlich mit der Datenbank, obwohl Sie nicht die foreign keys... aber ich will einfach fügen Sie Sie trotzdem.
  • ist zu kurz: jobprep_production ist der name der Datenbank. Ich bin nicht sicher, warum es ist, spuckt dieser Fehler jedoch.
  • Sieht aus wie ALTER TABLE ist nicht in der Lage, erstellen Sie eine temporäre Kopie der Tabelle. Können Sie erstellen, die diese Tabelle manuell? Das ist, führen Sie die CREATE TABLE company_to_module Anweisung manuell (natürlich, anstelle der Tabelle name)? Wenn es fehlschlägt, wird die Fehlermeldung möglicherweise Ihnen einen Tipp geben...
  • du hast Recht! Heilige Scheiße. Ich habe die exakt gleiche Tabelle mit einem neuen Namen und es scheiterte mit dem gleichen Fehler. Lösungen?
  • Tatsächlich, scratch, was ich oben sagte. Ich musste nur benennen Sie die foreign key-Namen. Wenn ich versuche, drop-Indizes auf "company_to_module", bekomme ich eine Fehlermeldung, die sagt, "#1025 - Error on rename of './jobprep_production/#sql-44a5_23a' to './jobprep_production/company_to_module' (errno: 150) "
  • Die company_to_module Schlüssel ist mit BTREE: KEY FK82977604FE40A062 (company_id) USING BTREE. Die company.company_id primary key ist es btree auch? Vielleicht ist das der Grund.
  • Ja, company_id ist auch mit btree. Ich habe so die Nase voll das problem, dass ich durch den Export der Datenbank Hinzugefügt, die Fremdschlüssel auf windows und dann re-importiert die Datenbank. Gearbeitet. Ich habe keine Ahnung, was die Hölle ist, sich mit mysql auf linux.
  • Können Sie noch einmal überprüfen Sie die Tabellen-Definitionen auf die beiden Tabellen in der linux-db? Sie sind genau so, wie du Sie gepostet?
  • ja. Ich benutze sowohl die mysql-console und phpMyAdmin, wo ich sehen kann, die Arten und die Art von btree-index alle auf dem gleichen Bildschirm. Das, was nicht sinnvoll ist, dass wenn meine Typen -, Spalten-Namen, Daten, etc. sind "wirklich" falsch, warum funktionieren Sie unter windows mit der exakt gleichen Datenbank? Dies macht keinen Sinn. Ich bin eigentlich mehr um eine Art von Korruption oder Schäden an diesen server jetzt.

InformationsquelleAutor egervari | 2011-04-15
Schreibe einen Kommentar