Problème ajout de Clé Étrangère à l'aide de l'instruction Alter Table avec MYSQL existante de la Base de données ne peut pas l'ajouter! À l'aide!

J'ai une base de données de production où j'ai renommé plusieurs colonnes qui sont des clés étrangères. Évidemment, mysql fait d'elle une véritable douleur de faire dans mon expérience.

Ma solution a été de supprimer tous les index et les clés étrangères, renommer la colonne d'id, et puis ajouter à nouveau l'index et les clés étrangères.

Cela fonctionne très bien sur mysql 5.1 sur windows pour le développement de la base de données.

Je suis allé à exécuter mon script de migration sur mon serveur debian, qui est aussi l'utilisation de mysql 5.1, et il donne l'erreur suivante:

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)

Il n'y a pas les valeurs de ce tableau qui seraient en conflit avec la clé étrangère, je suis en train d'ajouter. La base de données n'a pas changé. La clé étrangère N'existe pas avant... donc les données sont beaux. Il ne faut pas oublier que j'ai pris la MÊME base de données que j'ai sur le serveur, et il migre parfaitement sur Windows. Mais ces même clé étrangère migrations ne sont pas prise sur Debian.

Les colonnes sont en utilisant le même type BIGINT (20)

Les noms existent dans leurs tables respectives.

Les tables innodb. Ils ont déjà des clés étrangères dans les autres colonnes comme il est. Ce n'est pas une nouvelle base de données.

Je ne peux pas supprimer les tables parce que c'est une base de données de production.

Les tables "comme c'est" dans ma base de données:

 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

Et

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

Ici est la 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

Si j'essaie et baisse de l'indice de "company_to_module', j'obtiens cette erreur:

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

Voici mon innodb variables:

+---------------------------------+------------------------+
| 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                  |
+---------------------------------+------------------------+

Je tiens également à ajouter que pendant que je jouais avec l'ajout de clés étrangères, mysql corrompu de ma base de données et l'a détruit. J'ai dû recharger à partir d'une sauvegarde d'essayer de nouveau.

Aider? :/

Sont les deux tables InnoDB type?
Le company table ont un index sur company_id ?
Je suppose que votre table est MyISAM (la valeur par défaut si vous n'avez pas chnaged la config) et je pense que vous ne pouvez pas créer de contraintes de clés étrangères en MyISAM. Voir la description de la CREATE TABLE company_to_module.
Si les deux tables sont vides, de les déposer et de les recréer, en choisissant InnoDB que le moteur. Vous pouvez aussi ajouter la FOREIGN KEY contraintes dans le script de création de tables(s).
merci pour les conseils. Les deux tables ne sont pas vides - c'est une base de données de production. Je dois utilisateur de modifier le tableau. Toutes les tables innodb. En fait, il y a les clés étrangères existantes sur ces tables - ce n'est pas comme ce sont les premiers. Cette base de données a 40 tableaux des tonnes de clés étrangères dans toutes les tables. Donc je ne pense pas que c'est un de ces problèmes 🙁 Et oui, l'entreprise a l'id "company_id". J'étais sûr de le faire. L'application fonctionne avec la base de données en dépit de ne pas avoir les clés étrangères... mais je veux simplement ajouter de toute façon.

OriginalL'auteur egervari | 2011-04-15