MySQL Cannot Add Foreign Key Constraint

后端 未结 22 1818
时光取名叫无心
时光取名叫无心 2020-11-22 08:35

So I\'m trying to add Foreign Key constraints to my database as a project requirement and it worked the first time or two on different tables, but I have two tables on which

相关标签:
22条回答
  • 2020-11-22 08:49

    To find the specific error run this:

    SHOW ENGINE INNODB STATUS;
    

    And look in the LATEST FOREIGN KEY ERROR section.

    The data type for the child column must match the parent column exactly. For example, since medicalhistory.MedicalHistoryID is an INT, Patient.MedicalHistory also needs to be an INT, not a SMALLINT.

    Also, you should run the query set foreign_key_checks=0 before running the DDL so you can create the tables in an arbitrary order rather than needing to create all parent tables before the relevant child tables.

    0 讨论(0)
  • 2020-11-22 08:49

    To set a FOREIGN KEY in Table B you must set a KEY in the table A.

    In table A: INDEX id (id)

    And then in the table B,

    CONSTRAINT `FK_id` FOREIGN KEY (`id`) REFERENCES `table-A` (`id`)
    
    0 讨论(0)
  • 2020-11-22 08:52

    In my case, there was a syntax error which was not explicitly notified by MySQL console upon running the query. However, SHOW ENGINE INNODB STATUS command's LATEST FOREIGN KEY ERROR section reported,

      Syntax error close to:
    
      REFERENCES`role`(`id`) ON DELETE CASCADE) ENGINE = InnoDB DEFAULT CHARSET = utf8
    

    I had to leave a whitespace between REFERENCES and role to make it work.

    0 讨论(0)
  • 2020-11-22 08:54

    Check following rules :

    • First checks whether names are given right for table names

    • Second right data type give to foreign key ?

    0 讨论(0)
  • 2020-11-22 08:54

    NOTE: The following tables were taken from some site when I was doing some R&D on the database. So the naming convention is not proper.

    For me, the problem was, my parent table had the different character set than that of the one which I was creating.

    Parent Table (PRODUCTS)

    products | CREATE TABLE `products` (
      `productCode` varchar(15) NOT NULL,
      `productName` varchar(70) NOT NULL,
      `productLine` varchar(50) NOT NULL,
      `productScale` varchar(10) NOT NULL,
      `productVendor` varchar(50) NOT NULL,
      `productDescription` text NOT NULL,
      `quantityInStock` smallint(6) NOT NULL,
      `buyPrice` decimal(10,2) NOT NULL,
      `msrp` decimal(10,2) NOT NULL,
      PRIMARY KEY (`productCode`),
      KEY `productLine` (`productLine`),
      CONSTRAINT `products_ibfk_1` FOREIGN KEY (`productLine`) REFERENCES `productlines` (`productLine`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    

    Child Table which had a problem (PRICE_LOGS)

    price_logs | CREATE TABLE `price_logs` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `productCode` varchar(15) DEFAULT NULL,
      `old_price` decimal(20,2) NOT NULL,
      `new_price` decimal(20,2) NOT NULL,
      `added_on` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`),
      KEY `productCode` (`productCode`),
      CONSTRAINT `price_logs_ibfk_1` FOREIGN KEY (`productCode`) REFERENCES `products` (`productCode`) ON DELETE CASCADE ON UPDATE CASCADE
    );
    

    MODIFIED TO

    price_logs | CREATE TABLE `price_logs` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `productCode` varchar(15) DEFAULT NULL,
      `old_price` decimal(20,2) NOT NULL,
      `new_price` decimal(20,2) NOT NULL,
      `added_on` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`),
      KEY `productCode` (`productCode`),
      CONSTRAINT `price_logs_ibfk_1` FOREIGN KEY (`productCode`) REFERENCES `products` (`productCode`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 
    
    0 讨论(0)
  • 2020-11-22 08:57

    Had a similar error, but in my case I was missing to declare the pk as auto_increment.

    Just in case it could be helpful to anyone

    0 讨论(0)
提交回复
热议问题