Ajouter une clé étrangère à la table existante

Je veux append une clé étrangère à une table appelée “katalog”.

ALTER TABLE katalog ADD CONSTRAINT `fk_katalog_sprache` FOREIGN KEY (`Sprache`) REFERENCES `Sprache` (`ID`) ON DELETE SET NULL ON UPDATE SET NULL; 

Lorsque j’essaie de faire cela, je reçois ce message d’erreur:

 Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150) 

Erreur dans le statut INNODB:

120405 14:02:57 Erreur dans la contrainte de clé étrangère de la table mytable. # Sql-7fb1_7d3a:

 FOREIGN KEY (`Sprache`) REFERENCES `Sprache` (`ID`) ON DELETE SET NULL ON UPDATE SET NULL: Cannot resolve table name close to: (`ID`) ON DELETE SET NULL ON UPDATE SET NULL 

Lorsque j’utilise cette requête, cela fonctionne, mais avec une action “on delete” incorrecte:

 ALTER TABLE `katalog` ADD FOREIGN KEY (`Sprache` ) REFERENCES `sprache` (`ID` ) 

Les deux tables sont InnoDB et les deux champs sont “INT (11) not null”. J’utilise MySQL 5.1.61. Essayer de lancer cette requête ALTER avec MySQL Workbench (le plus récent) sur un MacBook Pro.

Instructions de création de table:

 CREATE TABLE `katalog` ( `ID` int(11) unsigned NOT NULL AUTO_INCREMENT, `Name` varchar(50) COLLATE utf8_unicode_ci NOT NULL, `AnzahlSeiten` int(4) unsigned NOT NULL, `Sprache` int(11) NOT NULL, PRIMARY KEY (`ID`), UNIQUE KEY `katalogname_uq` (`Name`) ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC$$ CREATE TABLE `sprache` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `Bezeichnung` varchar(45) NOT NULL, PRIMARY KEY (`ID`), UNIQUE KEY `Bezeichnung_UNIQUE` (`Bezeichnung`), KEY `ix_sprache_id` (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 

Pour append une clé étrangère (grade_id) à une table existante (utilisateurs), procédez comme suit:

 ALTER TABLE users ADD grade_id SMALLINT UNSIGNED NOT NULL DEFAULT 0; ALTER TABLE users ADD CONSTRAINT fk_grade_id FOREIGN KEY (grade_id) REFERENCES grades(id); 

Il suffit d’utiliser cette requête, je l’ai essayé selon mon scénario et cela fonctionne bien

 ALTER TABLE katalog ADD FOREIGN KEY (`Sprache`) REFERENCES Sprache(`ID`); 

cochez ce lien. Il m’a aidé avec errno 150: http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/

Au sumt de ma tête, deux choses me viennent à l’esprit.

  • Votre index de clé étrangère est-il un nom unique dans toute la firebase database (# 3 dans la liste)?
  • Essayez-vous de définir la table PK sur NULL lors de la mise à jour (n ° 5 dans la liste)?

Je suppose que le problème est avec le jeu NULL lors de la mise à jour (si mon cerveau n’est pas à l’arrière aujourd’hui comme il le fait si souvent…).

Edit: J’ai raté les commentaires sur votre post original. Les colonnes non signées / non signées int ont peut-être résolu votre cas. J’espère que mon lien aide quelqu’un dans la pensée future.

Étapes simples …

 ALTER TABLE t_name1 ADD FOREIGN KEY (column_name) REFERENCES t_name2(column_name) 
 FOREIGN KEY (`Sprache`) REFERENCES `Sprache` (`ID`) ON DELETE SET NULL ON UPDATE SET NULL; 

Mais votre table a:

 CREATE TABLE `katalog` ( `Sprache` int(11) NOT NULL, 

Il ne peut pas définir la colonne Sprache sur NULL car il est défini comme NOT NULL.

Lorsque vous ajoutez une contrainte de clé étrangère à une table à l’aide d’ALTER TABLE, n’oubliez pas de créer d’abord les index requirejs.

  1. Créer un index
  2. Alter table

MySQL exécutera cette requête:

 ALTER TABLE `db`.`table1` ADD COLUMN `col_table2_fk` INT UNSIGNED NULL, ADD INDEX `col_table2_fk_idx` (`col_table2_fk` ASC), ADD CONSTRAINT `col_table2_fk1` FOREIGN KEY (`col_table2_fk`) REFERENCES `db`.`table2` (`table2_id`) ON DELETE NO ACTION ON UPDATE NO ACTION; 

À votre santé!

tout essayer en une seule fois

  ALTER TABLE users ADD grade_id SMALLINT UNSIGNED NOT NULL DEFAULT 0, ADD CONSTRAINT fk_grade_id FOREIGN KEY (grade_id) REFERENCES grades(id);