4

当我尝试创建两个表时收到错误消息。有一个多值依赖关系,所以我将表分开并想出了这个:

CREATE TABLE NAME (
NameID      Integer             NOT NULL AUTO_INCREMENT,
Name        varChar(255)        NOT NULL,
CONSTRAINT  NAME_PK             PRIMARY KEY(NameID)
);

CREATE TABLE PHONE (
NameID      Integer             NOT NULL,
PhoneNumber varChar(15)         NOT NULL,
NumType     varChar(5)          NOT NULL,
CONSTRAINT  PHONE_FK            FOREIGN KEY(NameID)
    REFERENCES NAME(NameID),
CONSTRAINT  PHONE_PK            PRIMARY KEY(NameID)
);

但是当尝试使用此代码添加值时:

INSERT INTO NAME (NameID, Name) VALUES (default, 'John Doe');
INSERT INTO PHONE (NameID, PhoneNumber, NumType) VALUES (default, '706-782-4719', 'Home');

我收到臭名昭著的 1452 错误:

Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (`phone_mcneill`.`PHONE`, CONSTRAINT `PHONE_FK` FOREIGN KEY (`NameID`) REFERENCES `NAME` (`NameID`))

我不完全确定这意味着什么,因为我在第一个表中有 NameID 自动递增。我不能在第二个中使用它 auto_increment 以及它是一个外键,对吗?在此先感谢您的帮助。

4

1 回答 1

5

NameID您已经使用 insert for phone 表在表中定义了一个外键约束,PHONE您已经通过默认 NameID ,但是 NameID 指向NAME表并期望从NAME表中插入记录 id 它没有默认值文档

生成新的 AUTO_INCREMENT 值后,您还可以通过执行 SELECT LAST_INSERT_ID() 来获取它

所以你的第二个插入可以使用插入的 if from NAMEtable like

INSERT INTO NAME (NameID, NAME) VALUES (DEFAULT, 'John Doe');
INSERT INTO PHONE (NameID, PhoneNumber, NumType) VALUES (LAST_INSERT_ID(), '706-782-4719', 'Home');

您可以通过加入它们来从两个表中获取结果

select * from NAME
JOIN PHONE 
USING (NameID)

如何获取最后插入的行的唯一 ID

见小提琴演示

于 2014-03-05T22:28:50.750 回答