【发布时间】:2015-04-11 18:09:44
【问题描述】:
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”。
TFMODE:
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 作品
【问题讨论】:
-
你能把这些表的定义贴出来吗?
-
验证检查约束也或可能是触发器。
-
请发布表的创建语句(包括约束),以及用于在表中设置示例数据的插入语句,然后是演示您遇到的问题的插入语句。
-
正如 Nick.McDermaid 所说,错误是因为您没有 ID 为 11 的产品,而不是因为您没有 ID 为 953 的产品。