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

Je veux ajouter 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 le faire, j'obtiens ce message d'erreur:

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

Erreur dans L'état 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 mauvaise action "on delete":

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

Les deux tables sont InnoDB et les deux champs sont "INT (11) not null". Je suis de l'utilisation de MySQL 5.1.61. En essayant de lancez cette requête ALTER avec MySQL Workbench (le plus récent) sur un MacBook Pro.

Tableau Créer Des Instructions:

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
217
demandé sur Sankar 2012-04-05 16:02:37

8 réponses

Pour ajouter une clé étrangère (grade_id) à une table existante (users), 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);
378
répondu iltaf khalid 2015-07-18 22:38:10

Utilisez simplement 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`);
50
répondu SagarPPanchal 2014-01-28 12:05:47

Vérifiez 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/

Sur le dessus de ma tête, deux choses me viennent à l'esprit.

  • votre index de clé étrangère est-il un nom unique dans toute la base de données (#3 dans la liste)?
  • essayez-vous de définir la table PK à NULL lors de la mise à jour (#5 dans la liste)?

Je suppose que le problème est avec le SET NULL on update (si mon cerveau ne sont pas en arrière aujourd'hui comme ils le sont si souvent...).

Edit: j'ai manqué les commentaires sur votre message original. Non signé/non unsigned int colonnes peut-être résolu votre cas. J'espère que mon lien aide quelqu'un dans la pensée future.

14
répondu ZZ-bb 2012-04-05 13:19:53

Étapes Simples...

ALTER TABLE t_name1 ADD FOREIGN KEY (column_name) REFERENCES t_name2(column_name)
12
répondu Amjath Khan 2016-10-06 07:23:04
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,

It cant définit la colonne Sprache sur NULL car elle est définie comme NOT NULL.

11
répondu Bill 2013-04-01 17:12:08

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

  1. Créer un index
  2. Modifier la table
4
répondu Maksym Polshcha 2012-04-05 12:25:48

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;

Cheers!

3
répondu akelec 2017-01-31 07:56:36

Essayez tout en une seule 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);
1
répondu manoj 2016-05-08 19:24:25