Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MySQL Foreign Key Error 1005 errno 150 primary key as foreign key

I'm making a small DataBase with MySQL Workbench. I have a main table, called "Immobili", which has a Primary Key composed by four columns: (Comune, Via, Civico, Immobile).

I also have three other tables, which have the same primary key (Comune, Via, Civico, Immobile), but these fields are also referenced to the table Immobili.

First question: Can I make a Primary Key that is also a Foreign Key?

Second Question: When I try to export the changes it says:

Executing SQL script in server  # ERROR: Error 1005: Can't create table 'dbimmobili.condoni' (errno: 150)  CREATE  TABLE IF NOT EXISTS `dbimmobili`.`Condoni` (    `ComuneImmobile` VARCHAR(50) NOT NULL ,   `ViaImmobile` VARCHAR(50) NOT NULL ,   `CivicoImmobile` VARCHAR(5) NOT NULL ,   `InternoImmobile` VARCHAR(3) NOT NULL ,   `ProtocolloNumero` VARCHAR(15) NULL ,   `DataRichiestaSanatoria` DATE NULL ,   `DataSanatoria` DATE NULL ,   `SullePartiEsclusive` TINYINT(1) NULL ,   `SullePartiComuni` TINYINT(1) NULL ,   `OblazioneInEuro` DOUBLE NULL ,   `TecnicoOblazione` VARCHAR(45) NULL ,   `TelefonoTecnico` VARCHAR(15) NULL ,   INDEX `ComuneImmobile` (`ComuneImmobile` ASC) ,   INDEX `ViaImmobile` (`ViaImmobile` ASC) ,   INDEX `CivicoImmobile` (`CivicoImmobile` ASC) ,   INDEX `InternoImmobile` (`InternoImmobile` ASC) ,    PRIMARY KEY (`ComuneImmobile`, `ViaImmobile`, `CivicoImmobile`, `InternoImmobile`) ,    CONSTRAINT `ComuneImmobile`     FOREIGN KEY (`ComuneImmobile` )     REFERENCES `dbimmobili`.`Immobile` (`ComuneImmobile` )     ON DELETE CASCADE     ON UPDATE CASCADE,    CONSTRAINT `ViaImmobile`     FOREIGN KEY (`ViaImmobile` )     REFERENCES `dbimmobili`.`Immobile` (`ViaImmobile` )     ON DELETE CASCADE     ON UPDATE CASCADE,    CONSTRAINT `CivicoImmobile`     FOREIGN KEY (`CivicoImmobile` )     REFERENCES `dbimmobili`.`Immobile` (`CivicoImmobile` )     ON DELETE CASCADE     ON UPDATE CASCADE,    CONSTRAINT `InternoImmobile`     FOREIGN KEY (`InternoImmobile` )     REFERENCES `dbimmobili`.`Immobile` (`InternoImmobile` )     ON DELETE CASCADE     ON UPDATE CASCADE ) ENGINE = InnoDB 

Showing the Engine Status:

Error in foreign key constraint of table dbimmobili/valutazionimercato:

Cannot find an index in the referenced table where the referenced columns appear as the first columns, or columns typse in the table and the referenced table do not match for constraint. Note that the internal storage type of ENUM and SET changed in tables created with >= InnoDB-4.1.12, and such columns in old tables cannot be referenced by such columns in new tables.

Where am I doing wrong?

like image 581
IssamTP Avatar asked Oct 31 '10 12:10

IssamTP


People also ask

How to remove foreign key reference in MySQL?

Dropping Foreign Key Constraints You can drop a foreign key constraint using the following ALTER TABLE syntax: ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol; If the FOREIGN KEY clause defined a CONSTRAINT name when you created the constraint, you can refer to that name to drop the foreign key constraint.

How to check the foreign key constraint in MySQL?

To see foreign key relationships of a column: SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA. KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_SCHEMA = 'db_name' AND REFERENCED_TABLE_NAME = 'table_name' AND REFERENCED_COLUMN_NAME = 'column_name';

How to remove foreign key constraint in MySQL workbench?

To drop a foreign key, right-click the row you wish to delete, then select the Delete Selected FKs menu item. To modify properties of a foreign key, select it and make the desired changes.


1 Answers

When creating a foreign key constraint, MySQL requires a usable index on both the referencing table and also on the referenced table. The index on the referencing table is created automatically if one doesn't exist, but the one on the referenced table needs to be created manually (Source). Yours appears to be missing.

Test case:

CREATE TABLE tbl_a (     id int PRIMARY KEY,     some_other_id int,     value int ) ENGINE=INNODB; Query OK, 0 rows affected (0.10 sec)  CREATE TABLE tbl_b (     id int PRIMARY KEY,     a_id int,     FOREIGN KEY (a_id) REFERENCES tbl_a (some_other_id) ) ENGINE=INNODB; ERROR 1005 (HY000): Can't create table 'e.tbl_b' (errno: 150) 

But if we add an index on some_other_id:

CREATE INDEX ix_some_id ON tbl_a (some_other_id); Query OK, 0 rows affected (0.11 sec) Records: 0  Duplicates: 0  Warnings: 0  CREATE TABLE tbl_b (     id int PRIMARY KEY,     a_id int,     FOREIGN KEY (a_id) REFERENCES tbl_a (some_other_id) ) ENGINE=INNODB; Query OK, 0 rows affected (0.06 sec) 

This is often not an issue in most situations, since the referenced field is often the primary key of the referenced table, and the primary key is indexed automatically.

like image 96
Daniel Vassallo Avatar answered Sep 24 '22 04:09

Daniel Vassallo