外表

时间:2016-08-09 18:44:39

标签: sql oracle

我有这些Oracle表:

CREATE TABLE AGENT(
  ID INTEGER NOT NULL,
  GROUP_ID NUMBER(38,0),
  ........
)
/

CREATE INDEX IX_RELATIONSHIP_AG_GROUP ON AGENT (GROUP_ID)
/

ALTER TABLE AGENT ADD CONSTRAINT AGENTID PRIMARY KEY (ID)
/

CREATE TABLE AGENT_CONFIG(
  AGENT_CONFIG_ID INTEGER NOT NULL,
  AGENT_ID INTEGER,
  .......
)
/

CREATE INDEX IX_RELATIONSHIP16 ON AGENT_CONFIG (AGENT_ID)
/

ALTER TABLE AGENT_CONFIG ADD CONSTRAINT KEY17 PRIMARY KEY (AGENT_CONFIG_ID)
/

ALTER TABLE AGENT_CONFIG ADD CONSTRAINT RELATIONSHIP16 FOREIGN KEY (AGENT_ID) REFERENCES AGENT (ID)
/

我想使用第一个表AGENT作为主表来存储数据。在第二个表中,我想存储有关AGENT的配置,并使用AGENT ID作为唯一ID。

但我有这个问题:我成功地将行插入表AGENT。我还需要在表AGENT_CONFIG中添加具有相同ID的空行,然后更新该行。我如何复制这个ID值重复?可能与Oracle表触发器?是否有三种表格之间的特殊关系?

我使用此SQL查询插入AGENT表:

INSERT INTO AGENT ("ID, GROUP_ID, NAME.....) VALUES (AGENT_SEQ.nextval, ?, ......)

这是正确的查询:

INSERT INTO AGENT (ID, GROUP_ID......) VALUES (AGENT_SEQ.nextval, ?.......) 
RETURNING id INTO  INSERT INTO AGENT_CONFIG (AGENT_SEQ.nextval, Agent_ID) VALUES (id)"

2 个答案:

答案 0 :(得分:0)

对于这个使用currval伪列(如@Nicholas Krasnov指定的)你使用nextval for table" AGENT"后使用的序列。 Currval将复制您用于表" AGENT"的值。

例如:

1. INSERT INTO AGENT (ID, GROUP_ID......) VALUES (AGENT_SEQ.nextval, .......) 
2. INSERT INTO AGENT_CONFIG (AGENT_CONFIG_ID,AGENT_ID) VALUES (NULL,AGENT_SEQ.CURRVAL) ;

序列伪列的链接 - > https://docs.oracle.com/cd/B28359_01/server.111/b28286/pseudocolumns002.htm

答案 1 :(得分:0)

建立1:1或1:{1,n}关系并不容易:

  • 在父表中的每个插入中,您必须确保子表中的相应插入。
  • 在每次从父表中删除时,您必须确保删除相应的子记录(通常通过级联删除或仅仅通过外键约束)。
  • 每次从子表中删除时,您必须确保它不是其父项的最后一个。 (在这种情况下要么禁止删除,要么删除父母。)
  • 禁止或对ID更新做出反应。

您可以通过在表上禁用(即不授予)直接插入和删除(以及可能更新)来解决此问题,并提供PL / SQL函数来处理这些。

但是,如果您可以使用1:{0,1}或1:{0,n}关系,那么您只需编写父记录,然后查找其ID以编写子记录(s) )。