Įtraukite užsienio raktą į esamą lentelę

Noriu pridėti užsienio raktą į lentelę, pavadintą "katalogas".

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

Kai bandau tai padaryti, gaunu šį klaidos pranešimą:

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

Klaida būsenoje INNODB:

120405 14:02:57 Klaida ribojant stalo užsienio raktus. ŠIS # 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 

Kai naudoju šį užklausą, jis veikia, bet su neteisingu „ištrinti“ veiksmu:

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

Abi lentelės yra „InnoDB“, o abi sritys yra: „INT (11) null“. Naudoju MySQL 5.1.61. Bandykite paleisti šią ALTER užklausą naudodami „MySQL Workbench“ (naujausias) „MacBook Pro“.

Lentelių kūrimas:

 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 
241
05 апр. nustatė frgtv10 05 Bal 2012-04-05 15:02 '12 15:02 2012-04-05 15:02
@ 9 atsakymai

Jei norite įtraukti užsienio raktą (grade_id) į esamą lentelę (naudotojus), atlikite šiuos veiksmus:

 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); 
407
09 янв. Atsakymą pateikė iltaf khalid 09 jan. 2013-01-09 20:58 '13, 08:58 pm 2013-01-09 20:58

Tiesiog naudokite šį užklausą, bandžiau jį pagal mano scenarijų ir jis gerai veikia.

 ALTER TABLE katalog ADD FOREIGN KEY (`Sprache`) REFERENCES Sprache(`ID`); 
55
28 янв. atsakymą pateikė SagarPPanchal 28 jan. 2014-01-28 15:05 '14, 15:05 2014-01-28 15:05

Paprasti veiksmai ...

 ALTER TABLE t_name1 ADD FOREIGN KEY (column_name) REFERENCES t_name2(column_name) 
17
06 окт. atsakymas, kurį pateikė Amjath Khan 06 spalis 2016-10-06 09:55 '16 at 9:55 2016-10-06 09:55

patikrinkite šią nuorodą. Tai padėjo man paklaida 150: http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/

Ant mano galvos kyla du dalykai.

  • Ar jūsų užsienio raktų indeksas nurodo unikalų pavadinimą visoje duomenų bazėje (# 3 sąraše)?
  • Ar bandote atnaujinti PK lentelę į NULL (sąraše # 5)?

Darau prielaidą, kad problema yra susijusi su nustatyta NULL verte atnaujinant (jei mano smegenys šiandien nebevyksta, nes jie taip dažnai ...).

Redaguoti: praleidau komentarus apie pradinį įrašą. Nepatvirtintos / nepasirašytos int stulpeliai galėjo išspręsti jūsų bylą. Tikiuosi, kad mano ryšys padės kažkas ateityje galvoti.

14
05 апр. atsakymas pateikiamas ZZ-bb 05 balandžio. 2012-04-05 16:02 '12 4:02 pm 2012-04-05 16:02
 FOREIGN KEY (`Sprache`) REFERENCES `Sprache` (`ID`) ON DELETE SET NULL ON UPDATE SET NULL; 

Tačiau jūsų lentelėje yra:

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

Jis negali nustatyti „Sprache“ stulpelio į NULL, nes jis apibrėžiamas kaip NE NULL.

12
01 апр. Atsakymas pateiktas Bill 01 balandžio. 2013-04-01 20:12 '13, 08:12 pm 2013-04-01 20:12

Įtraukdami užsienio raktų suvaržymą į lentelę naudodami ALTER TABLE, nepamirškite sukurti reikiamų indeksų.

  • Sukurti indeksą
  • Pakeisti lentelę
4
05 апр. Atsakymas, kurį pateikė Maksym Polshcha 05 Bal 2012-04-05 15:25 '12, 15:25 pm 2012-04-05 15:25

„MySQL“ atliks šį užklausą:

 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; 

Hooray!

4
31 янв. atsakymas pateikiamas akelec sausio 31 d 2017-01-31 10:56 '17 at 10:56 2017-01-31 10:56

pabandykite visus pagal vieną užklausą

  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
08 мая '16 в 22:24 2016-05-08 22:24 atsakymas duotas manoj gegužės 08, 16 d., 22:24 2016-05-08 22:24

ALTER TABLE lentelės pavadinimas ADD CONSTRAINT some_name_for_foreign_key FOREIGN KEY (Foreign_Key_Column_Name) NUORODOS tablename_that_has_primaryKey (Primary_Key_ColumnName)

0
24 янв. Lakshmi Bindu Kambam atsakymas sausio 24 d 2019-01-24 15:56 '19, 15:56 pm 2019-01-24 15:56

Peržiūrėkite kitus klausimus apie „ žymas arba Užduokite klausimą