Buitenlandse sleutel toevoegen aan bestaande tabel

Ik wil een buitenlandse sleutel toevoegen aan een tafel genaamd “Katalog”.

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

Wanneer ik dit probeer, krijg ik deze foutmelding:

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

FOUT IN INNODB-status:

120405 14:02:57 Fout bij buitenlandse belangrijke beperking van de tabel
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

Wanneer ik deze query gebruik, werkt het, maar met verkeerd “op de actie”:

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

Beide tafels zijn Innodb en beide velden zijn “int (11) niet null”. Ik gebruik MYSQL 5.1.61. Proberen deze alter-query met MySQL Workbench (nieuwste) op een MacBook Pro.

Tabel Creëer verklaringen:

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

Antwoord 1, autoriteit 100%

Als u een externe sleutel (grade_id) aan een bestaande tabel (gebruikers) wilt toevoegen, volgt u de volgende stappen:

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);

Antwoord 2, autoriteit 14%

Gebruik gewoon deze query, ik heb het geprobeerd volgens mijn scenario en het werkt goed

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

Antwoord 3, autoriteit 5%

Eenvoudige stappen…

ALTER TABLE t_name1 ADD FOREIGN KEY (column_name) REFERENCES t_name2(column_name)

Antwoord 4, autoriteit 3%

controleer deze link. Het heeft me geholpen met errno 150:
http: //verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/

Er komen twee dingen in me op.

  • Is uw refererende sleutelindex een unieke naam in de hele database (#3 in de lijst)?
  • Probeer je de tabel PK in te stellen op NULL bij update (#5 in de lijst)?

Ik vermoed dat het probleem zit in de ingestelde NULL bij update (als mijn hersenen vandaag niet achteruit staan, zoals zo vaak…).

EDIT: Ik heb de opmerkingen op je oorspronkelijke post gemist. Unsigned / Not Unsigned int Columns Misschien opgelost je zaak. Ik hoop dat mijn link iemand in de toekomstige gedachte helpt.


5

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

  1. Wijzig uw tabel en voeg er een index toe.

    ALTER TABLE users ADD INDEX index_name (index_column)
    
  2. Voeg nu de beperking toe

    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;
    

Opmerking Als u geen index toevoegt, werkt het niet.

Nadat ik er ongeveer 6 uur mee vond, bedacht ik de oplossing
Ik hoop dat dit een ziel redt.


6

MySQL voert deze query uit:

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!


Antwoord 7

Als u een externe-sleutelbeperking aan een tabel toevoegt met ALTER TABLE, vergeet dan niet eerst de vereiste indexen te maken.

  1. Maak index
  2. Tabel wijzigen

Antwoord 8

probeer alles in één zoekopdracht

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

Antwoord 9

stap 1: voer dit script uit

SET FOREIGN_KEY_CHECKS=0;

stap 2: kolom toevoegen

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

stap 3: voeg externe sleutel toe aan de toegevoegde kolom

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

stap 4: voer dit script uit

SET FOREIGN_KEY_CHECKS=1;

Antwoord 10

De beperking van de refererende sleutel moet hetzelfde gegevenstype zijn als de primaire sleutel in de referentietabel en kolom


Antwoord 11

dit gebeurt in principe omdat je tabellen in twee verschillende tekensets staan. als voorbeeld is een tabel gemaakt in charset=utf-8 en andere tabellen zijn gemaakt in CHARSET=latin1, dus je wilt een vreemde sleutel aan deze tabellen kunnen toevoegen. gebruik dezelfde tekenset in beide tabellen, dan kunt u vreemde sleutels toevoegen. error 1005 foriegn key constraint onjuist gevormd kan dit oplossen


Antwoord 12

ik heb hetzelfde probleem gehad. Ik heb in mijn geval al gegevens in de tabel en er waren sleutels in deze tabel die niet aanwezig waren in de referentietabel. Dus ik moest deze rijen verwijderen die de beperkingen niet respecteren en alles werkte.


Antwoord 13

ALTER TABLE TABLENAME ADD FOREIGN KEY (Column Name) REFERENCES TableName(column name)

Voorbeeld:-

ALTER TABLE Department ADD FOREIGN KEY (EmployeeId) REFERENCES Employee(EmployeeId)

Other episodes