Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 获取无法添加或更新子项:外键约束_Mysql_Sql - Fatal编程技术网

Mysql 获取无法添加或更新子项:外键约束

Mysql 获取无法添加或更新子项:外键约束,mysql,sql,Mysql,Sql,我在尝试将信息插入SQL时遇到此错误。我当然知道它是从哪里来的,但我不知道我在哪里没有输入错误的值 下面是我所有的代码 CREATE TABLE Customer ( CustomerID integer NOT NULL AUTO_INCREMENT, LName varchar(200), FName varchar(200), StreetAdd varchar(200), AptNum integer, City varchar(100), State varchar(100), Zip

我在尝试将信息插入SQL时遇到此错误。我当然知道它是从哪里来的,但我不知道我在哪里没有输入错误的值

下面是我所有的代码

CREATE TABLE Customer (
CustomerID integer NOT NULL AUTO_INCREMENT,
LName varchar(200),
FName varchar(200),
StreetAdd varchar(200),
AptNum integer,
City varchar(100),
State varchar(100),
Zip integer,
HPhone bigint,
MPhone bigint,
OPhone bigint,
PRIMARY KEY (CustomerID));

CREATE TABLE Donut(
  DonutID integer NOT NULL,
  Name varchar(100),
  Description varchar(200),
  UnitPrice float(2),
  PRIMARY KEY (DonutID));


CREATE TABLE DOrder (
OrderID integer NOT NULL AUTO_INCREMENT,
OrderDate timestamp,
Notes varchar(400),
CustomerID integer,
PRIMARY KEY(OrderID),
FOREIGN KEY (CustomerID) REFERENCES Customer(CustomerID));

CREATE TABLE Invoice(
  Quantity smallint,
  OrderID integer NOT NULL AUTO_INCREMENT,
  DonutID integer NOT NULL,
  PRIMARY KEY(DonutID, OrderID),
  FOREIGN KEY (OrderID) REFERENCES DOrder(OrderID),
  FOREIGN KEY (DonutID) REFERENCES Donut(DonutID));



INSERT INTO Customer (LName, FName, StreetAdd, City, State, Zip, HPhone)
VALUES ('Roberts','Tammy','3210 Shale Hollow Drive','Evansville','IN',47720, 8888888888);

INSERT INTO Donut (DonutID, Name, Description, UnitPrice)
VALUES (3,'ChocoSprinkle','Chocolate Icing with sprinkles',1.50);

INSERT INTO DOrder (Notes)
VALUES ('include plates and napkins');

INSERT INTO Invoice (OrderID, DonutID, Quantity)
VALUES (1,1,1);

提前谢谢

问题在于最后一次插入:您没有为2个外键提供任何值。这两列不应自动递增,您应该为它们提供其他两个表中已经存在的显式值:

INSERT INTO Invoice (OrderID, DonutID, Quantity)
VALUES (1,1,1);
此外,如果您将一个字段声明为数字类型,例如整数,那么请不要在其中插入字符串,而是数字,正如我在上面的示例中所示。

在句子中

INSERT INTO Invoice (Quantity)
VALUES ('1');

。。。
OrderID
DonutID
列没有显式值。而且,由于它们都是数字类型,MySql引擎将采用正确的自动默认值。在这种情况下,默认数值为0

因此,当它尝试将新发票行与父表匹配时,它将搜索
DonutId
=0的
Donut
,以及
OrderId
=0的
DOrder
。因为没有这样的行,所以它会产生您得到的错误

还要一条线索吗?尝试将
订单
DOrderId
=0一起插入,将
甜甜圈
甜甜圈
=0一起插入,然后重新尝试将
插入发票(数量)值('1')
。看到它成功


最佳做法是始终为PK列提供显式的非空值(并将PK列定义为
非空
)。

应该有更多的错误。无法将值放入时间戳列,在不允许的地方插入空值…不,这是它唯一的错误。在我必须重做发票表中的两个FK并在发票表中声明PK之前,没有问题。我们只是关注约束错误的问题,其他一切都很好。我已经向orderid、customerid添加了自动增量,并且我能够消除错误,但是现在我有一个错误,说orderid没有默认值。这应该从1开始。我不必在更新代码的insert值中声明,现在您只需插入id为3的甜甜圈。然后,在invoice表中插入一条记录,其中指定1作为甜甜圈id,您会惊讶地发现它不起作用。将甜甜圈表和订单表中的现有值作为发票表中的ID提供,您将不会得到外键错误。这就是REIGN键要确保的!在表
DOrder
中插入时,应将DOrder.CustomerID分配给表Customer.CustomerID中存在的一个编号,因为DOrder.CustomerID是一个外键,请参考Customer.CustomerID谢谢,我相信我没有任何字符串变成数字类型。添加代码后,我仍然会收到错误。很抱歉,我忘记在上一条注释中附加完整错误。无法添加或更新子行:外键约束失败(
db\u 9\u 8673fa
发票,约束发票外键(
DonutID
)引用
donut
DonutID
)是的。在问题中包含的每个插入查询中。然后检查甜甜圈和订单表中作为id的值。根据插入查询,两个表中都应该有id=1的记录。您好,我想我理解您的意思。对不起,我对SQL非常陌生。我已经更新了代码,最上面的订单id是suppose是自动递增的(很抱歉,当我决定上传时,我在摆弄我的代码),我必须让它们是相同的号码吗?事实上,当我取回你的信息时,我得到的信息太多了!!我的快乐压倒一切,我花了两周的时间才弄明白这一点,然后我的也是。:-)“而且,由于它们都是数字类型,MySql引擎将采用正确的自动默认值。”-不,MySql不会自动采用默认值,除非您为create表中的字段定义默认值。