我有一个表,其中字段ID作为主键,另一个字段PID作为ID字段的外键。两者都是长数据类型。
所以这是我的表格结构
CREATE TABLE `myobj` (
`ID` BIGINT(100) NOT NULL AUTO_INCREMENT,
`FRIENDLY_NAME` VARCHAR(100) DEFAULT NULL,
`PARENT_ID` BIGINT(100) DEFAULT NULL,
`PARENT` VARCHAR(100) DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `PARENT_ID` (`PARENT_ID`),
CONSTRAINT `myobj_ibfk_1` FOREIGN KEY (`PARENT_ID`) REFERENCES `myobj` (`ID`) ON DELETE CASCADE
) ENGINE=INNODB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1
我使用Hibernate作为ORM插入MySQL DB。问题是
当一个或多个记录为顶级且没有父ID时,插入顶级记录时会出错。看起来好像没有父ID 它只接受NULL。
但是从Java应用程序代码的角度来看,数据类型很长,因此当我通过Hibernate插入一个对象时,默认值为0,它看起来像一个约束违规
无法添加或更新子行:a 外键约束失败 (
genericdb
。myobj
,CONSTRAINTmyobj_ibfk_1
外国钥匙 (PARENT_ID
)参考myobj
(ID
)ON DELETE CASCADE)
将0设置为通过sql CLI的值时,也会出现此问题。
Second Secnario:
还尝试将PARENT_ID的默认值设置为0.
CREATE TABLE `myobj` (
`ID` BIGINT(100) NOT NULL AUTO_INCREMENT,
`FRIENDLY_NAME` VARCHAR(100) DEFAULT NULL,
`PARENT_ID` BIGINT(100) DEFAULT '0',
`PARENT` VARCHAR(100) DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `PARENT_ID` (`PARENT_ID`),
CONSTRAINT `myobj_ibfk_1` FOREIGN KEY (`PARENT_ID`) REFERENCES `myobj` (`ID`) ON DELETE CASCADE
) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
所以当我在Parent_ID字段中插入0时,仍然是错误
无法添加或更新子行:a 外键约束失败 (
genericdb
。myobj
,CONSTRAINTmyobj_ibfk_1
外国钥匙 (PARENT_ID
)参考myobj
(ID
)ON DELETE CASCADE)
如果有任何问题,请告诉我。
答案 0 :(得分:0)
问题在于您尝试使用id 0 指向myobj中的行,该行不存在。该列的默认值应为null。
我很确定如果你运行select * from myobj where id = 0
,你就不会得到任何结果。