web-dev-qa-db-fra.com

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

Je veux ajouter une clé étrangère à une table appelée "catalogue".

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, j'obtiens 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

Quand j’utilise cette requête, cela fonctionne, mais avec une mauvaise action "lors de la suppression":

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

Les deux tables sont InnoDB et les deux champs sont "INT (11) pas 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
279
frgtv10

Pour ajouter 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);
470
iltaf khalid

Utilisez simplement cette requête, je l'ai essayée selon mon scénario et cela fonctionne bien

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

étapes simples ...

ALTER TABLE t_name1 ADD FOREIGN KEY (column_name) REFERENCES t_name2(column_name)
21
Amjath Khan

vérifiez ce lien. Cela 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 sommet de ma tête, deux choses me viennent à l’esprit.

  • Votre clé étrangère indexe-t-elle un nom unique dans toute la base de données (n ° 3 dans la liste)?
  • Essayez-vous de définir la table PK sur NULL lors de la mise à jour (n ° 5 dans la liste)?

J'imagine que le problème vient de la valeur définie sur NULL lors de la mise à jour (si mon cerveau n'est pas à l'envers aujourd'hui, comme ils le sont si souvent ...).

Edit: j'ai manqué les commentaires sur votre message d'origine. Des colonnes int non signées/non non signées peuvent résoudre votre cas. J'espère que mon lien aide quelqu'un dans la pensée future.

14
ZZ-bb
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 cant définit la colonne Sprache sur NULL car elle est définie comme NOT NULL.

12
Bill

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

  1. Créer un index
  2. Modifier table
4
Maksym Polshcha

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é!

4
akelec

essayez tout en une requête

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

Comment réparer Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150) in mysql.

  1. modifiez votre table et ajoutez-y un index.

    ALTER TABLE users ADD INDEX index_name (index_column)
    
  2. Ajoutez maintenant la contrainte

    ALTER TABLE foreign_key_table
    ADD CONSTRAINT foreign_key_name FOREIGN KEY (foreign_key_column)
    REFERENCES primary_key_table (primary_key_column) ON DELETE NO ACTION
    ON UPDATE CASCADE;
    

Notez que si vous n’ajoutez pas d’index, cela ne fonctionnera pas.

Après avoir lutté pendant environ 6 heures, j'ai trouvé la solution et j'espère que cela sauvera une âme.

2
Kwed