2

2 つの Oracle テーブルがあります。

CREATE TABLE MANAGEDSYSTEMS(
  MSYSTEMID INTEGER NOT NULL,
  MSYSTEMGROUPID INTEGER,
  SPECIALNUMBER VARCHAR2(40 ),
  SERIALNUMBER VARCHAR2(30 ),
  MSYSTEMSTATUS VARCHAR2(30 ),
  MSYSTEMNAME VARCHAR2(60 ),
  IPADDRESS VARCHAR2(30 ),
  DATEMSYSTEMADDED TIMESTAMP(6),
  DESCRIPTION CLOB
)
/

-- ADD KEYS FOR TABLE MANAGEDSYSTEMS

ALTER TABLE MANAGEDSYSTEMS ADD CONSTRAINT MSKEY PRIMARY KEY (MSYSTEMID)
/


CREATE TABLE AGENTS(
  AGENTID INTEGER NOT NULL,
  MSYSTEMID INTEGER,
  AGENTGROUPID INTEGER,
  AGENTSERIALNUMBER VARCHAR2(60 ),
  AGENTSTATUS VARCHAR2(30 ),
  AGENTOS VARCHAR2(60 ),
  AGENTIPADDRESS VARCHAR2(40 ),
  LASTSYNC TIMESTAMP(6),
  DATEAGENTADDED TIMESTAMP(6),
  CPULOADLIMIT INTEGER,
  RAMLOADLIMIT INTEGER,
  HDDSPACELIMIT INTEGER,
  NETWORKUPLIMIT INTEGER,
  NETWORKDOWNLIMIT INTEGER,
  REPORTUSERLOGINS VARCHAR2(30 ),
  CANEXECCOMMANDS VARCHAR2(30 ),
  SYNCHRONIZATIONTIME VARCHAR2(30 ),
  DATALIMITSPEAKTIMES INTEGER,
  DESCRIPTION CLOB
)
/

-- ADD KEYS FOR TABLE AGENTS

    ALTER TABLE AGENTS ADD CONSTRAINT AGENTID PRIMARY KEY (AGENTID)
ALTER TABLE AGENTS ADD CONSTRAINT MSYSTEMID FOREIGN KEY (MSYSTEMID) REFERENCES MANAGEDSYSTEMS (MSYSTEMID)

「Agent」を「Managedsystems」テーブルに割り当てたいと考えています。ご覧のとおり、テーブルの外部キーがあります。ユーザーはまず管理対象システムを作成し、次にエージェントを作成する必要があります。しかし、管理対象システムを割り当てずにエージェントを作成するオプションも提供したいと考えています。管理対象システム ID のキーをエージェント テーブルに変更しようとすると、次のエラーが発生します。

Caused by: java.sql.SQLIntegrityConstraintViolationException: ORA-02291: integrity constraint (ADMIN.MSYSTEMID) violated - parent key not found

空の値を割り当てることはできないようです。この問題を解決するにはどうすればよいですか?

アップデート:

次の SQL ステートメントを使用して、エージェント テーブルを更新します。

String sql = "UPDATE AGENTS "
                             + " SET AGENTID = ?, MSYSTEMID = ?, AGENTGROUPID = ?, AGENTSERIALNUMBER = ?, AGENTSTATUS = ?, AGENTOS = ?, AGENTIPADDRESS = ?, "
                             + " LASTSYNC = to_timestamp(?, " + ts_template + "), DATEAGENTADDED = to_timestamp(?, " + ts_template + "), "
                             + " CPULOADLIMIT = ?, RAMLOADLIMIT = ?, HDDSPACELIMIT = ?, NETWORKUPLIMIT = ?, NETWORKDOWNLIMIT = ?, REPORTUSERLOGINS = ?, "
                             + " CANEXECCOMMANDS = ?, SYNCHRONIZATIONTIME = ?, DATALIMITSPEAKTIMES = ?, "
                             + " DESCRIPTION = ? WHERE AGENTID = ?";
4

2 に答える 2

0

同じトランザクションで両方のテーブルに挿入しているが、最初に子テーブルに挿入したい場合は、FK を最初に延期します。

SQL> CREATE TABLE MANAGEDSYSTEMS(
  2    MSYSTEMID INTEGER NOT NULL,
  3    MSYSTEMGROUPID INTEGER,
  4    SPECIALNUMBER VARCHAR2(40 ),
  5    SERIALNUMBER VARCHAR2(30 ),
  6    MSYSTEMSTATUS VARCHAR2(30 ),
  7    MSYSTEMNAME VARCHAR2(60 ),
  8    IPADDRESS VARCHAR2(30 ),
  9    DATEMSYSTEMADDED TIMESTAMP(6),
 10    DESCRIPTION CLOB
 11  )
 12  /

Table created.

SQL> ALTER TABLE MANAGEDSYSTEMS ADD CONSTRAINT MSKEY PRIMARY KEY (MSYSTEMID);

Table altered.

SQL> CREATE TABLE AGENTS(
  2    AGENTID INTEGER NOT NULL,
  3    MSYSTEMID INTEGER,
  4    AGENTGROUPID INTEGER,
  5    AGENTSERIALNUMBER VARCHAR2(60 ),
  6    AGENTSTATUS VARCHAR2(30 ),
  7    AGENTOS VARCHAR2(60 ),
  8    AGENTIPADDRESS VARCHAR2(40 ),
  9    LASTSYNC TIMESTAMP(6),
 10    DATEAGENTADDED TIMESTAMP(6),
 11    CPULOADLIMIT INTEGER,
 12    RAMLOADLIMIT INTEGER,
 13    HDDSPACELIMIT INTEGER,
 14    NETWORKUPLIMIT INTEGER,
 15    NETWORKDOWNLIMIT INTEGER,
 16    REPORTUSERLOGINS VARCHAR2(30 ),
 17    CANEXECCOMMANDS VARCHAR2(30 ),
 18    SYNCHRONIZATIONTIME VARCHAR2(30 ),
 19    DATALIMITSPEAKTIMES INTEGER,
 20    DESCRIPTION CLOB
 21  )
 22  /

Table created.

SQL> ALTER TABLE AGENTS ADD CONSTRAINT AGENTID PRIMARY KEY (AGENTID);

Table altered.

SQL> ALTER TABLE AGENTS ADD CONSTRAINT MSYSTEMID FOREIGN KEY (MSYSTEMID) REFERENCES MANAGEDSYSTEMS (MSYSTEMID) initially deferred;

Table altered.

SQL> insert into AGENTS (AGENTID, MSYSTEMID, AGENTGROUPID, AGENTSERIALNUMBER) values (1, 1, 1, 'x');

1 row created.

SQL> insert into MANAGEDSYSTEMS (MSYSTEMID, MSYSTEMGROUPID, SPECIALNUMBER) values (1, 1, 'x');

1 row created.

SQL> commit;

Commit complete.

ただし、親なしでトランザクションを終了させることはできません。

SQL> insert into AGENTS (AGENTID, MSYSTEMID, AGENTGROUPID, AGENTSERIALNUMBER) values (2, 2, 1, 'x');

1 row created.

SQL> commit;
commit
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-02291: integrity constraint (DTD_TRADE.MSYSTEMID) violated - parent key not
found
于 2012-12-11T11:41:39.833 に答える