2

我很难使用ORA-02291: 完整性约束,我有一个表(TF_MODE),它链接到另一个表(PRODUCT),这样您就可以在 TF_MODE 中为各种产品设置一行。问题是我可以在 TF_MODE 表中完美插入 10 行,但是当我尝试插入第 11 行时(即当 ID = 11 时)我得到“ORA-02291:完整性约束”,即使外键确实存在PRODUCT 表中的第 11 个条目,奇怪的是,如果我将 ID 更改为 12/14,则查询成功,但对于某些 ID,它将不起作用,例如 999,1000 ;没有固定的模式无法正常工作,所以基本上问题出在少数 ID 值上而不是因为该外键的值不存在于父表中(实际上该值确实存在)。

我正在使用 Oracle 11g。

知道这种奇怪行为背后的原因是什么吗?

谢谢 !

更新:

没有触发器,唯一的检查约束是“IS NOT NULL”。

TF模式:

CREATE TABLE "DESIGN"."TFMODE"
(
"ID"                NUMBER(38,0) NOT NULL ENABLE,
"F_PRODUCT"         NUMBER(38,0) NOT NULL ENABLE,
"SYS.CURRENT_I[MA]" NUMBER(10,3) NOT NULL ENABLE,
"LAST_MODIFIED_DATE" DATE NOT NULL ENABLE,
"VOLTAGE" NUMBER(10,3) NOT NULL ENABLE,
CONSTRAINT "TFMODE_PK" PRIMARY KEY ("ID") USING 
INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(
INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 
0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT 
CELL_FLASH_CACHE DEFAULT) TABLESPACE "DESIGN" ENABLE,
CONSTRAINT "TFMODE_PRODUCT_FK1" FOREIGN KEY ("ID") REFERENCES 
 "DESIGN"."PRODUCT" ("ID") ENABLE
) 

 SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
NOCOMPRESS LOGGING STORAGE
(
INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0
FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT 
CELL_FLASH_CACHE DEFAULT
)
TABLESPACE "DESIGN" ;

产品:

CREATE TABLE "DESIGN"."PRODUCT"
(
"ID"           NUMBER(*,0) NOT NULL ENABLE,
"MANUFACTURER" VARCHAR2(100 BYTE),
...
)
TABLESPACE "DESIGN" ;

PRODUCT 表有很多列,为简洁起见已被省略。

插入语句(来自 java 应用程序):

INSERT INTO TFMODE VALUES  ( 11, 953, 2.27, to_date('2014-11-18','YYYY-MM-DD'), 3.8) 

我尝试从 sql developer 编辑东西,但结果相同,这是屏幕截图:

ID=11 不起作用

在此处输入图像描述

ID=12 作品

在此处输入图像描述

4

1 回答 1

4

检查您的外键定义。难道不应该

CONSTRAINT "TFMODE_PRODUCT_FK1" FOREIGN KEY ("F_PRODUCT") REFERENCES 
 "DESIGN"."PRODUCT" ("ID") ENABLE
) 

在发布的一个中,您正在链接两个没有多大意义的主键

于 2015-02-11T11:54:44.070 回答