为什么我不能在MySQL Workbench中添加外键约束

时间:2017-09-28 16:23:01

标签: mysql mysql-workbench

我的客户表包含nid_c,nama_customer和更多字段..
第二个表我和nopol,nid_c,nama_customer和更多领域有kendaraan ..

我尝试在这张桌子之间建立关系..
当我更新客户表时,我想在kendaraan表上更新数据nid_c和nama_customer。 我在这里收到了错误消息。

Executing SQL script in server
ERROR: Error 1215: Cannot add foreign key constraint
SQL Code:
        -- -----------------------------------------------------
        -- Table `BengkelBiru`.`kendaraan`
        -- -----------------------------------------------------
        CREATE TABLE IF NOT EXISTS `BengkelBiru`.`kendaraan` (
          `NOPOL` VARCHAR(12) NOT NULL,
          `NID_C` VARCHAR(7) NULL DEFAULT NULL,
          `NAMA_CUSTOMER` VARCHAR(25) NULL DEFAULT NULL,
          `MERK` VARCHAR(15) NULL DEFAULT NULL,
          `TYPE` VARCHAR(25) NULL DEFAULT NULL,
          `CC` VARCHAR(4) NULL DEFAULT NULL,
          `TAHUN` VARCHAR(4) NULL DEFAULT NULL,
          `WARNA` VARCHAR(10) NULL DEFAULT NULL,
          `STATUS` VARCHAR(7) NULL DEFAULT NULL,
          PRIMARY KEY (`NOPOL`),
          INDEX `pkk_idx` (`NAMA_CUSTOMER` ASC, `NID_C` ASC),
          CONSTRAINT `FK_NID_C`
            FOREIGN KEY (`NAMA_CUSTOMER` , `NID_C`)
            REFERENCES `BengkelBiru`.`customer` (`NID_C` , `NID_C`)
            ON DELETE NO ACTION
            ON UPDATE CASCADE)
        ENGINE = InnoDB
        DEFAULT CHARACTER SET = utf8

SQL script execution finished: statements: 14 succeeded, 1 failed

Fetching back view definitions in final form.
Nothing to fetch

3 个答案:

答案 0 :(得分:1)

您的问题出现在以下一行或两行中:

FOREIGN KEY (`NAMA_CUSTOMER` , `NID_C`)
REFERENCES `BengkelBiru`.`customer` (`NID_C` , `NID_C`)
                                     ^^^^^^^ Looks wrong s/b NAMA_CUSTOMER

我想你想要这一行:

REFERENCES `BengkelBiru`.`customer` (`NID_C` , `NID_C`)

REFERENCES `BengkelBiru`.`customer` (`NAMA_CUSTOMER`, `NID_C`)

为什么在引用中两次引用NID_C?我这样说是因为您将外键定义为:

FOREIGN KEY (`NAMA_CUSTOMER` , `NID_C`)

,您在顶部的说明显示客户将NID_C和NAMA_CUSTOMER列为列。

然而,从根本上说,为什么你在kendaraan(车辆)表中有Nama_customer?这似乎不是第3范式。您在第二个表中重复了客户名称;这不是客户PK的一部分。现在,如果您希望在输入kendaraan时保留客户的名称,这可能是可以接受的;但是既然你把它作为FK的一部分......并且进行级联更新/删除......这很奇怪。

所以也许你只想要:

FOREIGN KEY (`NID_C`)
REFERENCES `BengkelBiru`.`customer` (`NID_C`)

假设客户的主键是NID_C

答案 1 :(得分:0)

我认为你不能同时宣布两者。尝试单独进行。

        CONSTRAINT `FK_NAMA_CUSTOMER`
        FOREIGN KEY (`NAMA_CUSTOMER`)
        REFERENCES `BengkelBiru`.`customer` (`NID_C`)


        CONSTRAINT `FK_NID_C`
        FOREIGN KEY (`NID_C`)
        REFERENCES `BengkelBiru`.`customer` (`NID_C`)

答案 2 :(得分:0)

可能存在任何可能的情况: -

1 。父表中的列可以是INT UNSIGNED吗?

2 。两个表中的数据类型应相同。

3 。您正在尝试在目标表上引用不存在的密钥。确保它是另一个表上的键(它可以是主键或唯一键)。

Foregin Key Constaints