在同一个表中出现PKEY和FKEY的情况

时间:2011-03-02 15:32:51

标签: java mysql hibernate

我有一个表,其中字段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   外键约束失败   (genericdbmyobj,CONSTRAINT   myobj_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   外键约束失败   (genericdbmyobj,CONSTRAINT   myobj_ibfk_1外国钥匙   (PARENT_ID)参考myobj   (ID)ON DELETE CASCADE)

如果有任何问题,请告诉我。

1 个答案:

答案 0 :(得分:0)

问题在于您尝试使用id 0 指向myobj中的行,该行不存在。该列的默认值应为null。

我很确定如果你运行select * from myobj where id = 0,你就不会得到任何结果。