oracle 如何在表中插入主键和外键都在一个表中但外键引用另一个表的数据?

62o28rlo  于 2023-04-29  发布在  Oracle
关注(0)|答案(3)|浏览(235)

我的主表是Table 1,需要将table 2的数据插入到table 1中,但得到这个错误
错误报告- ORA-02291:完整性约束(KPI.table1_table3_FK1)违规-找不到父密钥:
由于Table 1具有名为Table 1的主键和外键:- Primary keys:-

a
b
c
d
e
f
g

表3引用的外键

a
b
c
d

请帮助我,为什么我不能插入数据,因为我删除了所有重复的记录以及。
我不想破坏或改变或删除约束,因为它可能会影响数据计数。
请让我知道更清晰。

dfddblmv

dfddblmv1#

您所询问的是关于在使用PK和FK的表之间建立和使用relationship。主要是一个(详细)表中的FK引用另一个(主)表中的PK。要做到这一点,你首先应该有主表-也许像这样:

--------------------------------------------------------
--
--  DDL for Table TABLE3  -  from SQLDeveloper
--------------------------------------------------------
  CREATE TABLE "SomeUser"."TABLE3" 
   (    "ID_3" VARCHAR2(1 BYTE), 
        "SOME_T3_COL" VARCHAR2(20 BYTE)
   ) 
--
--  DDL for Index TABLE3_PK
  CREATE UNIQUE INDEX "SomeUser"."TABLE3_PK" ON "SomeUser"."TABLE3" ("ID_3");
--
--  Constraints for Table TABLE3
  ALTER TABLE "SomeUser"."TABLE3" MODIFY ("ID_3" NOT NULL ENABLE);
  ALTER TABLE "SomeUser"."TABLE3" ADD CONSTRAINT "TABLE3_PK" PRIMARY KEY ("ID_3");

现在您有了定义PK的“主”表。..下一步-你需要“细节”表与FK指的是主人的PK

--------------------------------------------------------
--
--  DDL for Table TABLE1  -  from SQLDeveloper
--------------------------------------------------------
  CREATE TABLE "SomeUser"."TABLE1" 
   (    "ID_1" VARCHAR2(1 BYTE), 
        "SOME_T1_COL" VARCHAR2(50 BYTE), 
        "FK_TO_ID_3" VARCHAR2(1 BYTE)
   );
--
--  DDL for Index TABLE1_PK
  CREATE UNIQUE INDEX "SomeUser"."TABLE1_PK" ON "SomeUser"."TABLE1" ("ID_1");
--
--  Constraints for Table TABLE1
  ALTER TABLE "SomeUser"."TABLE1" MODIFY ("ID_1" NOT NULL ENABLE);
  ALTER TABLE "SomeUser"."TABLE1" ADD CONSTRAINT "TABLE1_PK" PRIMARY KEY ("ID_1");
--
--  Ref Constraints for Table TABLE1
  ALTER TABLE "SomeUser"."TABLE1" ADD CONSTRAINT "TABLE1_FK1" FOREIGN KEY ("ID_1")
      REFERENCES "SomeUser"."TABLE3" ("ID_3") ENABLE;

现在,您可以插入行,记住,应先插入主行,然后再插入与主行相关的详细信息行:

Insert Into TABLE3 VALUES('a', 'some a data');    -- first insert row to the master table
Insert Into TABLE1 VALUES('a', 'some t1_a data reffering to t3PK_a --> ', 'a');   -- now you can insert detail row reffering to the master table's PK
Commit;

Insert Into TABLE3 VALUES('b', 'some b data');
Insert Into TABLE1 VALUES('b', 'some t1_b data reffering to t3PK_b --> ', 'b');
Commit;

--
--  test it:
Select t3.ID_3, t3.SOME_T3_COL, t1.SOME_T1_col, t1.FK_TO_ID_3
From TABLE3 t3
Inner Join TABLE1 t1 ON(t1.FK_TO_ID_3 = t3.ID_3);
--
--  R e s u l t:
ID_3 SOME_T3_COL          SOME_T1_COL                                        FK_TO_ID_3
---- -------------------- -------------------------------------------------- ----------
a    some a data          some t1_a data reffering to t3PK_a -->             a
b    some b data          some t1_b data reffering to t3PK_b -->             b
qqrboqgw

qqrboqgw2#

如果您有表和示例数据:

CREATE TABLE table3 (
  a NUMBER,
  b NUMBER,
  c NUMBER,
  d NUMBER,
  PRIMARY KEY (a, b, c, d)
);

CREATE TABLE table2 (
  a NUMBER,
  b NUMBER,
  c NUMBER,
  d NUMBER,
  e NUMBER,
  f NUMBER
);

CREATE TABLE table1 (
  a,
  b,
  c,
  d,
  e NUMBER,
  f NUMBER,
  g NUMBER,
  CONSTRAINT table1__a_b_c_d_e_f_g__pk PRIMARY KEY (a, b, c, d, e, f, g),
  CONSTRAINT table1__a_b_c_d__fk FOREIGN KEY (a, b, c, d) REFERENCES table3 (a, b, c, d)
);

INSERT INTO table2 (a, b, c, d, e, f) VALUES (1, 1, 1, 1, 1, 1);
INSERT INTO table2 (a, b, c, d, e, f) VALUES (1, 1, 1, 1, 2, 2);

试着(根据你的评论)用途:

INSERT INTO table1 (a, b, c, d, e, f)
  SELECT a, b, c, d, e, f FROM table2

然后你会得到错误:

ORA-01400: cannot insert NULL into ("SCHEMA_NAME"."TABLE1"."G")

因为您尚未指定g的值。
如果为g指定值:

INSERT INTO table1 (a, b, c, d, e, f, g)
  SELECT a, b, c, d, e, f, 42 FROM table2

然后你会得到错误:

ORA-02291: integrity constraint (FIDDLE_MEFJVYJLMUQDENAEVHVX.TABLE1__A_B_C_D__FK) violated - parent key not found

因为外键约束在引用的表中找不到匹配的值。
然后,如果将值插入table3,以便有一行供参照约束引用:

MERGE INTO table3 dst
USING ( SELECT DISTINCT a, b, c, d FROM table2 ) src
ON (src.a = dst.a AND src.b = dst.b AND src.c = dst.c AND src.d = dst.d)
WHEN NOT MATCHED THEN
  INSERT (a, b, c, d)
  VALUES (src.a, src.b, src.c, src.d);

然后:

INSERT INTO table1 (a, b, c, d, e, f, g)
  SELECT a, b, c, d, e, f, 42 FROM table2

工作。
fiddle

wpcxdonn

wpcxdonn3#

首先将数据插入父表,然后复制主表的主键并将数据作为外键发送到子表。
关键点-。别忘了承诺。在步骤中插入数据。先是主人,然后是孩子。如果你这样做只是为了学习。我会建议你禁用键。首先只学习DML部分。之后,您可以尝试使用约束。

相关问题