我是一个完全是MySQL的新手。我的问题非常明显。我有两张桌子
CREATE TABLE tbl_addresses(
PK_ADDRESS_ID int NOT NULL AUTO_INCREMENT,
house_number int NOT NULL,
street varchar(35),
district varchar(35),
city varchar(35),
postcode varchar(8),
PRIMARY KEY (PK_ADDRESS_ID)
);
CREATE TABLE tbl_people(
PK_PERSON_ID int NOT NULL AUTO_INCREMENT,
title varchar(6) NOT NULL, # Master / Mister therefor 6 is max
forename varchar(35) NOT NULL,
surname varchar(35) NOT NULL,
date_of_birth DATE NOT NULL,
contact_number varchar(12) NOT NULL,
FK_ADDRESS_ID int NOT NULL,
PRIMARY KEY (PK_PERSON_ID),
FOREIGN KEY (FK_ADDRESS_ID) REFERENCES tbl_addresses (PK_ADDRESS_ID)
);
我尝试使用以下语法从Java将数据导入这些表
INSERT INTO tbl_addresses (house_number,street,district,city,postcode) VALUES ('1','abc','','abc','abc');
INSERT INTO tbl_people (title,forename,surname,date_of_birth,contact_number) VALUES ('Mr','Tri ','Nguyen','1991-1-1','0123456789');
我收到了错误Field 'FK_ADDRESS_ID'doesn't have a default value
,数据实际上是tbl_addresses
而不是tbl_people
。我错过了什么吗?提前谢谢!
答案 0 :(得分:1)
此错误是由于您将FK_ADDRESS_ID
表格中的tbl_people
字段标记为NOT NULL
,但您尝试执行INSERT
而未指定值这个专栏。
这样的事情可以毫无错误地发挥作用:
INSERT INTO tbl_people (title, forename, surname, date_of_birth,
contact_number, FK_ADDRESS_ID)
VALUES ('Mr', 'Tri', 'Nguyen', '1991-1-1', '0123456789', 1);
您还可以为FK_ADDRESS_ID
指定默认值(您提到的错误消息)。以下是添加默认值的方法:
ALTER TABLE tbl_people MODIFY COLUMN FK_ADDRESS_ID int NOT NULL DEFAULT 1
但是因为FK_ADDRESS_ID
是另一个表的键,所以该值应该基于tbl_addresses
中的主键。
答案 1 :(得分:1)
您使用外键的事实并不是您收到此错误的原因。我们来看看您的列定义。
FK_ADDRESS_ID int NOT NULL,
这不是null,但不是默认值。现在看看你的插入语句
INSERT INTO tbl_people (title,forename,surname,date_of_birth,contact_number)
FK_ADDRESS_ID
不在您的列列表中,但它不能为空且没有默认值,那么mysql可以做什么?当然会产生错误。
最好的办法是将该列定义为可空。
让我们重新审视外键约束。
FOREIGN KEY(FK_ADDRESS_ID)参考tbl_addresses(PK_ADDRESS_ID)
这真正说明的是,如果您将值赋予FK_ADDRESS_ID,则该值应存在于tbl_address的PK_ADDRESS_ID列中
作为附注,习惯上使用小写字母表/列名称。