如何在SQL中修复外键错误

时间:2019-04-29 15:05:14

标签: mysql sql database foreign-keys

我正在使用Ubuntu创建数据库,并且正在尝试向下表添加外键。这是我的代码。

CREATE TABLE Vehicles (    
    Vehicle_ID int NOT NULL,
    Vehicle_Type VARCHAR(255) NOT NULL,
    Model_name VARCHAR(255) NOT NULL,
    Engine_Size numeric(2,1) NOT NULL,
    Vehicle_Condition VARCHAR(255) NOT NULL,
    Price numeric(9,2) NOT NULL,
    PRIMARY KEY (Vehicle_ID)
);


CREATE TABLE Models (
    Model_ID int NOT NULL,
    Manufacturer VARCHAR(255) NOT NULL,
    Model_name VARCHAR(255) NOT NULL,
    Wheel_Drive_Type VARCHAR(255) NOT NULL,
    PRIMARY KEY (Model_ID)
);

每当我运行以下代码时,它都会返回错误“ ERROR 1215(HY000):无法添加外键约束”,我也不知道为什么-尤其是它们都具有相同的输入类型。

ALTER TABLE Vehicles
    ADD FOREIGN KEY (Model_Name) REFERENCES Models(Model_Name);
  

错误1215(HY000):无法添加外键约束

4 个答案:

答案 0 :(得分:1)

按照https://www.w3schools.com/sql/sql_foreignkey.asp

您需要创建的FK必须参考Models表PK,即Model_ID。

您正在尝试将其链接到并非唯一的Model_name。

CREATE TABLE Vehicles (    
Vehicle_ID int NOT NULL,
Vehicle_Type VARCHAR(255) NOT NULL,
Model_ID INT NOT NULL,
Engine_Size numeric(2,1) NOT NULL,
Vehicle_Condition VARCHAR(255) NOT NULL,
Price numeric(9,2) NOT NULL,
    PRIMARY KEY (Vehicle_ID)
);


CREATE TABLE Models (
    Model_ID int NOT NULL,
    Manufacturer VARCHAR(255) NOT NULL,
    Model_name VARCHAR(255) NOT NULL,
    Wheel_Drive_Type VARCHAR(255) NOT NULL,
    PRIMARY KEY (Model_ID)
);

您将被允许做

ALTER TABLE Vehicles
    ADD FOREIGN KEY (Model_ID ) REFERENCES Models(Model_ID );

http://www.sqlfiddle.com/#!9/8b6ad7

答案 1 :(得分:0)

我可以通过做一些事情来解决这个问题。我为纠正此问题所做的一切都来自这里:

https://dev.mysql.com/doc/refman/5.5/en/alter-table.html

特别是标题:“外键和其他约束”

我注意到并改变了几件事。首先引起我注意的是,即使不是Models表上的主键,您也使用Model_name作为外键。我不确定这是否是必需条件,但似乎已不可行。

意见:外键和主键字段应始终为“ ID”,而不应为“名称”。因此,我将Vehicles中的model_name字段替换为Model ID,并更新为INT(以匹配Models)。

然后我在alter table中稍微修改了语法:

ALTER TABLE Vehicles
    ADD CONSTRAINT model_FK FOREIGN KEY (Model_ID) REFERENCES Models(Model_ID); 

一切正常!

我认为,如果您想将Model_name用作Vehicles中的外键,则需要将其作为Models的主键,或者可以在具有Model_name的Models上添加索引。这与我尝试更改表以创建model_name FK时看到的错误消息更加吻合...关于“缺少引用表模型中约束的索引”的信息。

答案 2 :(得分:-1)

尝试:

OLD_IMAGE_DEPENDS_wic_append_armada38x += "virtual/bootloader:do_populate_sysroot"
do_image_wic[depends] += "${OLD_IMAGE_DEPENDS_wic}"

答案 3 :(得分:-1)

可能是因为您试图将Varchar字段用作外键,并且MySQL不喜欢将VarChar用作键,除非将它们指定为BINARY。同时指定CHARSET和COLLATE属性也很麻烦//

将BINARY添加到列规范中,并且ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;表规范应该解决它。 EG:

CREATE TABLE Vehicles (    
    Vehicle_ID int NOT NULL,
    Vehicle_Type VARCHAR(255) NOT NULL,
    Model_name VARCHAR(255) NOT NULL,
    Engine_Size numeric(2,1) NOT NULL,
    Vehicle_Condition VARCHAR(255) NOT NULL,
    Price numeric(9,2) NOT NULL,
    PRIMARY KEY (Vehicle_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


CREATE TABLE Models (
    Model_ID int NOT NULL,
    Manufacturer VARCHAR(255) NOT NULL,
    Model_name VARCHAR(255) BINARY NOT NULL,
    Wheel_Drive_Type VARCHAR(255) NOT NULL,
    PRIMARY KEY (Model_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;