425 Stimmen

Fremdschlüssel zu vorhandener Tabelle hinzufügen

Ich möchte einen Fremdschlüssel zu einer Tabelle namens "katalog" hinzufügen.

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

Wenn ich versuche, dies zu tun, erhalte ich diese Fehlermeldung:

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

Fehler in INNODB Status:

120405 14:02:57 Fehler in Fremdschlüssel-Beschränkung der Tabelle 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

Wenn ich diese Abfrage verwende, funktioniert sie, aber mit der falschen "on delete"-Aktion:

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

Beide Tabellen sind InnoDB und beide Felder sind "INT(11) not null". Ich verwende MySQL 5.1.61. Ich versuche, diese ALTER-Abfrage mit MySQL Workbench (neueste Version) auf einem MacBook Pro auszuführen.

Tabelle Anweisungen erstellen:

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

10voto

Kwed Punkte 181

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

  1. Ändern Sie Ihre Tabelle und fügen Sie ihr einen Index hinzu.

    ALTER TABLE users ADD INDEX index_name (index_column)
  2. Fügen Sie nun die Bedingung

    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;

Hinweis: Wenn Sie keinen Index hinzufügen, wird es nicht funktionieren.

Nachdem ich mich etwa 6 Stunden lang damit herumgeschlagen hatte, fand ich die Lösung Ich hoffe, das rettet eine Seele.

8voto

akelec Punkte 3425

MySQL wird diese Abfrage ausführen:

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;

Zum Wohl!

4voto

Maksym Polshcha Punkte 17488

Wenn Sie mit ALTER TABLE eine Fremdschlüssel-Beschränkung zu einer Tabelle hinzufügen, denken Sie daran, zuerst die erforderlichen Indizes zu erstellen.

  1. Index erstellen
  2. Tabelle ändern

4voto

manoj Punkte 2743

Alles in einer Abfrage versuchen

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

4voto

Schritt 1: Dieses Skript ausführen

SET FOREIGN_KEY_CHECKS=0;

Schritt 2: Spalte hinzufügen

ALTER TABLE mileage_unit ADD COLUMN COMPANY_ID BIGINT(20) NOT NULL

Schritt 3: Fremdschlüssel zur hinzugefügten Spalte hinzufügen

ALTER TABLE mileage_unit
ADD FOREIGN KEY (COMPANY_ID) REFERENCES company_mst(COMPANY_ID);

Schritt 4: Dieses Skript ausführen

SET FOREIGN_KEY_CHECKS=1;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X