回答

收藏

MySQL错误代码1452外键约束

技术问答 技术问答 140 人阅读 | 0 人回复 | 2023-09-13

尝试创建两个表时收到错误消息。有一个多值依赖项,因此我分离了表并提出了这个建议:
( q: B' d* d$ V2 v/ z9 z/ h2 P$ l: jCREATE TABLE NAME (6 u( S( _- a; H6 I% Q# ]
NameID      Integer             NOT NULL AUTO_INCREMENT,* R: J6 K+ m2 e% k' C" N  W
Name        varChar(255)        NOT NULL,9 O- U  a% v9 \1 q" @
CONSTRAINT  NAME_PK             PRIMARY KEY(NameID)! I# Y  O$ q; i2 r" f0 v0 N
);- u# u2 _/ i  m& M1 Z$ [
CREATE TABLE PHONE (
/ `' M) k0 g  p( Y. v  p3 c' ANameID      Integer             NOT NULL,
! l. j3 S% D2 ?% M; S; P. j' S0 X0 aPhoneNumber varChar(15)         NOT NULL,4 x& y5 X/ B, [  S$ h0 |
NumType     varChar(5)          NOT NULL,  K: a, q% v( J& P% r5 v
CONSTRAINT  PHONE_FK            FOREIGN KEY(NameID)2 \% i1 \7 \; z1 f3 M, t8 ]
    REFERENCES NAME(NameID),
. G' V7 o! k+ v' PCONSTRAINT  PHONE_PK            PRIMARY KEY(NameID)) W3 a% y( O. u
);! M; Q) R6 \, p. r- Y  A, z" q" r
但是,当尝试使用此代码添加值时:/ @* a7 s0 N( g; e
INSERT INTO NAME (NameID, Name) VALUES (default, 'John Doe');- x/ X. c( O; j7 H8 F, l
INSERT INTO PHONE (NameID, PhoneNumber, NumType) VALUES (default, '706-782-4719', 'Home');
" p" m$ l0 H* q+ l" N" |7 P我收到臭名昭著的1452错误:2 o* `7 S- n+ R& v1 w1 e% A
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`))$ q9 ~' C5 x  q3 m2 M/ p0 p
我不完全确定这意味着什么,因为我在第一个表中具有NameID自动递增功能。我不能在第二个中使用auto_increment,因为它是外键,对吗?在此先感谢您的帮助。
: ?- L5 q( _3 Y               
  u: e/ W/ }, q1 p4 V解决方案:
1 c% }( s/ x  e. X                $ W. n$ I" S" K: k$ `) f
6 b5 N1 w4 i4 R2 x' U# D
) n- i+ s$ G; L, M  K5 v
                您已经在NameID列上定义了外键约束,即在表中PHONE使用insert作为电话表,您已经对NameID传递了默认值,但是NameID指向NAME表,并希望从NAME表中插入记录ID,因此没有默认值文档  g) a2 c: @' O: C: A

9 U6 ]8 f5 M; e) I9 U生成新的AUTO_INCREMENT值后,您还可以通过执行SELECT LAST_INSERT_ID()获得它
3 [4 L; m6 z" ]+ Y2 C/ P3 \4 J5 E% t# Z6 D4 \
所以您的第二个插入可以使用插入的if from NAMEtable像
9 Y5 x% I% M# C$ pINSERT INTO NAME (NameID, NAME) VALUES (DEFAULT, 'John Doe');
, y- r4 x; |, X4 g8 CINSERT INTO PHONE (NameID, PhoneNumber, NumType) VALUES (LAST_INSERT_ID(), '706-782-4719', 'Home');
% m2 k8 n1 M. D, l' R: {: v( Z+ T您可以通过加入两个表来获取结果
$ ], u  ?. C* G8 y# C* S; |select * from NAME
/ @8 ^- l" D: E; z( C" J& RJOIN PHONE
' v0 U. \$ H$ F. q, ?& h" f# ?USING (NameID)
( _8 p, T/ p& x/ w* u9 E如何获取最后插入行的唯一ID
( u) M9 t. X4 E7 ~参见小提琴演示
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则