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 aufcompany_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 desCREATE 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, dieFOREIGN 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 dieCREATE 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
. Diecompany.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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind beide Tabellen InnoDB-Typ?
Nimmt die Firma eine Tabelle über einen index auf company_id ?
Ich nehme an, dass deine Tabelle ist MyISAM (die Standardeinstellung, wenn Sie nicht die Konfiguration geändert) und Sie können keine foreign key-Einschränkungen in MyISAM. Siehe die Beschreibung des CREATE TABLE für yout zwei Tabellen.
Wenn beide Tabellen leer sind, löschen Sie und neu erstellen Sie, die Wahl von InnoDB als engine. Man könnte auch hinzufügen, die FOREIGN-KEY-constraints in der Tabellen-Erstellung Skript(en).
Aus Der MySQL -Referenz-Handbuch:
@egervari: Was passiert, wenn Sie dies ausführen:
Und wenn Sie ausführen:
CREATE TABLE
?ALTER TABLE
?Sicherzustellen, dass company_to_module.company_id und Unternehmen.company_id sind die EXAKT gleichen Datentyp. Ich musste dies geschehen, wenn der Primärschlüssel war eingerichtet wie ein UNSIGNED INT sein, aber die foreign-key-Feld war nur eine INT. Hinzufügen UNSIGNED der Datentyp das problem behoben.
Habe ich einfach auf die refactorings mit Windows und dann wieder importiert die Datenbank in den Debian - es funktioniert.
Ich denke, es ist sicher zu sagen, dass etwas Durcheinander gebracht wurde, auf dem Debian server, oder mit der linux-version von Mysql - vielleicht ein bug in 5.1 bauen?
Sowieso, ich habe auch ein Upgrade des ram auf dem server, von 1 GB auf 2 GB, und diese Probleme sind verschwunden.
Ich denke, dass die MySQL vielleicht einfach nicht genug Speicher, um den Vorgang abzuschließen. Wenn das der Fall war (und so scheint es zu sein), denke ich, dass MySQL haben sollte, einfach gesagt, anstatt spuckt diesen Fehler - das macht mich und alle hier denken, es war ein syntax-oder ein schema-bezogenes problem.
Trotzdem, vielen Dank für diejenigen, die versucht haben zu helfen. Zumindest ist es mir half, mich zu isolieren, all die Dinge, die es nicht hätte.
Da scheint es nicht zu sein, alles syntax-Verwandte, meine beste Vermutung wäre, dass Sie laufen aus dem Raum für das erstellen von InnoDB-Tabellen.
BEARBEITEN: Können Sie fügen Sie Ihre InnoDB-Konfiguration:
Da versuchen, erstellen Sie eine Kopie der
company_to_module
manuell gibt Ihnen die gleiche Fehlermeldung, sollten Sie überprüfen Sie sorgfältig die fk-constraint bereits incompany_to_module
. Ist es immer noch gültig, oder hast du die Tabelle ändernmodule
?Aus der Die MySQL-Docs:
@egervari Sie schrieb - 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.
Stimme mit Ihnen überein. Aber es könnte sein, dass etwas schief ging. Ich reproduzierte den Fehler, und (in meinem Fall) behoben.
Ich würde vorschlagen, Sie zu laufen, OPTIMIZE TABLE-Befehl für die Tabelle, wo die Spalte umbenannt wurde. Die Dokumentation sagt - Für InnoDB-Tabellen, OPTIMIEREN TABELLE zugeordnet ist, ÄNDERN TABELLE, die erstellt die Tabelle zu aktualisieren, die index-Statistiken und den freien ungenutzten Speicherplatz in den gruppierten index.
Eine weitere Lösung:
Drop eindeutigen Schlüssel in der referenzierten Tabelle (Schlüssel, der verwendet wird, die durch foreign key -, in Ihrem Fall ist es eine primary key). Fügen Sie neue foreign key-und neu gedroppt eindeutigen Schlüssel.
Eine weitere Lösung:
Versuchen, add-and-drop neue Spalte in der referenzierten Tabelle, dann versuchen Sie, erstellen Sie Ihren foreign key.