我正在使用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):无法添加外键约束
答案 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 );
答案 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;