当前位置: 首页 > 知识库问答 >
问题:

从列表中自动连接PK和FK

程俊誉
2023-03-14

我正在开发一个java应用程序,使用过程将信息保存在数据库中。我会举个例子来证明我的怀疑,因为我有点迷路了!

让我们假装我有两个不同的班级

public class Seg{
//variables
 ....

public class Dur{
//variables
private List list<Seg> //Lets pretend that Dur1 has 3 seg, and Dur1's PK = 1
....

我想把信息保存在数据库中。由于Dur1有3秒,代码PK=1,所以我将有3个插入秒,其中FK=1=Dur的PK

我的问题是,假设(在java中)我知道seg和Dur之间的所有匹配(我有连接它们的列表),我如何使用一个过程,自动地在三个seg插入中放置一个FK

//注:pk是程序中定义的一个属性,带有序列

我担心有些人可能不理解这个问题,但实际上我有点困惑

谢谢大家

共有2个答案

姬博瀚
2023-03-14

嘿,我试着用一个例子来说明你的情况。希望有帮助。请原谅任何语法错误,因为我目前没有工作区。

--Drop any existing object with same name
DROP TABLE A1PK;

DROP SEQUENCE A1PK_seq;

-- Seq creation
CREATE SEQUENCE A1PK_seq START WITH 1 INCREMENT BY 1;

-- Provding req privileges
GRANT SELECT ON INFRA_OWNER.A1PK_seq TO PUBLIC;

--Root table creation
CREATE TABLE AIK
(PK_ID NUMBER PRIMARY KEY,
PK_NAME VARCHAR2(100));

--Drop existing object
DROP TABLE FK1;

--Create Child table
CREATE TABLE FK1
(
PK_ID NUMBER,
PK_ADD1 VARCHAR2(100),
PK_ADD2 VARCHAR2(100)
);

--Drop any existing constraints if any with same name
ALTER TABLE FK1
DROP CONSTRAINT FK_PK;

--Adding foreign key for child table
ALTER TABLE FK1
ADD CONSTRAINT FK_PK FOREIGN KEY(PK_ID) REFERENCES AIK(PK_ID);


CREATE OR REPLACE PROCEDURE insert_into_child_tables
(p_seg1 IN VARCHAR2,
 p_seg2 IN VARCHAR2,
 p_seg3 IN VARCHAR2,
 p_root_val IN VARCHAR2)
 AS 
 lv_long LONG;
 lv_seq PLS_INTEGER;
 BEGIN
  SELECT INFRA_OWNER.A1PK_SEQ.NEXTVAL 
  INTO lv_seq 
  FROM DUAL;

  INSERT
  INTO INFRA_OWNER.AIK VALUES
    (
      lv_seq,
      p_root_val
    );

  FOR I IN
  (SELECT a1.OWNER,
      a1.CONSTRAINT_NAME,
      a1.TABLE_NAME
    FROM ALL_CONSTRAINTS a1
    WHERE A1.R_CONSTRAINT_NAME IN
      (SELECT a2.CONSTRAINT_NAME
      FROM ALL_CONSTRAINTS a2
      WHERE a2.TABLE_NAME    = 'AIK'
      AND a2.constraint_type = 'P'
      )
    ORDER BY A1.TABLE_NAME
  )
  LOOP
    EXECUTE IMMEDIATE 'INSERT INTO '||I.OWNER||'.'||I.TABLE_NAME||' VALUES ('||lv_seq||','||''''||lv_seg1||''''||','||''''||lv_seg2||''''||')';
    EXECUTE IMMEDIATE 'INSERT INTO '||I.OWNER||'.'||I.TABLE_NAME||' VALUES ('||lv_seq||','||''''||lv_seg1||''''||','||''''||lv_seg2||''''||')';
    EXECUTE IMMEDIATE 'INSERT INTO '||I.OWNER||'.'||I.TABLE_NAME||' VALUES ('||lv_seq||','||''''||lv_seg1||''''||','||''''||lv_seg2||''''||')';
  END LOOP;
END;
邢曦
2023-03-14

您的示例(以及对FK的关注)表明,您是否试图定义一个简单的PL/SQL层来处理基本CRUD(在PL/SQL中也称为TAPI),或者是否打算封装某种业务逻辑,这一点并不清楚。

在前一种情况下,您可能会重新考虑您的方法,并查看某种ORM。

不要误解我的意思,我不是想用“做点别的”来回答你的问题。我的观点是,在ORM中有很多关于你的情况(数据库分配的键)的经验,所以简单的搜索链接类似于上面的链接,并使其适应你的PL/SQL解决方案。

在我看来,您需要在存储父类的过程中提供一个输出参数,返回分配给PK的序列,并在存储子类的过程中传递这个值。

 类似资料:
  • 问题内容: 可以与列表一起使用吗? 就像我有带有mimetypes的属性文件,而在我的班级文件中,我有类似的东西 问题答案: Spring 4支持自动收集给定类型的所有bean并将其注入到集合或数组中的能力。 例:

  • 问题内容: 我已经定义了一个接口及其一些实现,并且都用进行了注释。 然后,我通过以下方式将它们自动连接到我的应用中: 工人被列入列表的顺序取决于什么? 我怎样才能让更多的和(也实现)不带注释通过我被装配到同一个列表? 是否保留了xml 的顺序和xml 的顺序? 我是否可以依靠规则将工作人员A,B,C和D放入列表的顺序? 问题答案: 如果要在Spring注入的List中对这些依赖项进行排序,请使用@

  • 我是Spring的新手。我正面临Spring-Boot的问题。我正在尝试将外部配置文件中的字段自动装配到自动装配的bean中。我有以下类 应用程序。Java语言 AppConfig。Java语言 服务接口 服务1 我无法在App类的postconstruct方法中显示服务名称变量。我这样做对吗?

  • 问题内容: 我有一类具有类型的对象列表。 我的弹簧配置看起来像这样。 现在,可以在列表中自动自动连接所有类型的bean,而不是显式连接列表中的每个守护程序实现。我要解决的问题是,如果有人创建了类的新实现的bean,却忘记将其连接到列表中。 我已经在stackoverflow上的某个地方看到了这个问题,但无法再次找到它。对此表示歉意。 问题答案: 它应该像这样工作(从您的XML中删除ArrayLis

  • 问题内容: 我想将用户持久保存到数据库中,并使用IDENTITY生成类型创建的User的ID(PK)的当前方案。例如 但我想在以下情况下进行操作:1)用户明确设置。2)如果未设置用户,则将自动分配它,并且它必须是唯一的。 请建议我一些可用的选项,以便我解决。谢谢。 问题答案: 您可以为此目的定义您的自定义ID生成器,如本SOAnswer中指出的那样 它的代码如下所示: 和

  • 在这个示例中,我有两个表,包含我的客户和一家办公用品商店的产品的数据。如下所示: 上面的表主要功能是为第三个表,即订单表,提供所需的数据 使用订单表,我可以从客户和产品表中获得我需要的报告的快速摘要。当我想查看每个客户每件商品的购买数量时,问题就开始了。 比如这些表格。 使用上面的表格,我需要创建一个报告,显示每个项目的每个客户的购买数量。 像这样。 我已经使用通过来显示项目,但是我现在的代码太长