MySQL - 将数据添加到2个表中,1个具有外键

时间:2016-11-16 05:33:53

标签: mysql foreign-keys

我是一个完全是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。我错过了什么吗?提前谢谢!

2 个答案:

答案 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列中

作为附注,习惯上使用小写字母表/列名称。