是否可以在ORACLE 11g的父记录之前插入子记录?

时间:2018-04-06 03:38:17

标签: oracle

我需要编写一个DML脚本来显示它是如何形成的 如果儿童的FK约束检查是,可以在其父母记录之前插入儿童记录 延迟到节省时间和需要 手动执行允许此检查延迟的更改。

以下是两个表格:

CREATE TABLE customers (
       cust_code    VARCHAR2(3),
       name         VARCHAR2(50),
      region        VARCHAR2(5))
TABLESPACE  mine;

CREATE TABLE orders (
      ord_id        NUMBER(3),
      ord_date      DATE,
      cust_code     VARCHAR2(3),
      date_of_dely  DATE )
TABLESPACE  mine
PCTFREE     20
PCTUSED     50
MAXTRANS    100;
Primary Key中的{p> Customercust_code Foreign Key中的Orderscust_code

2 个答案:

答案 0 :(得分:2)

首先,您需要创建两个costraints(主键+ foreing键)才能使用子/父关系检查:

CREATE TABLE customers (
       cust_code    VARCHAR2(3),
       name         VARCHAR2(50),
      region        VARCHAR2(5),
      constraint cust_pk PRIMARY KEY ( cust_code)
);


CREATE TABLE orders (
      ord_id        NUMBER(3),
      ord_date      DATE,
      cust_code     VARCHAR2(3),
      date_of_dely  DATE,
      constraint cust_fk foreign key (cust_code) references customers(cust_code) deferrable
      )
;

在约束定义的末尾注意关键字可延迟。这使得约束可以推迟,即约束检查可以延迟,没有这个子句就不可能。

现在,如果您尝试插入引用非现有客户的订单,您将收到错误,因为必须事先插入订单:

insert into orders values( 1, sysdate, 1, sysdate);

ORA-02291: integrity constraint (TEST.CUST_FK) violated - parent key not found

但是您可以使用SET CONSTRAINT命令来更改此行为,并在提交之前推迟对单个事务的约束检查,因此您可以在没有客户的情况下插入订单,约束的检查将推迟到提交时间:

set constraint cust_fk deferred;
Constraint CUST_FK succeeded.

insert into orders values( 1, sysdate, 1, sysdate);
1 row inserted.

commit;
ORA-02091: transaction rolled back
ORA-02291: integrity constraint (TEST.CUST_FK) violated - parent key not found

答案 1 :(得分:0)

这是一个完整的,有效的例子。请注意orders中的引用完整性约束(外键约束) - 它是deferrable initially deferred

create table customers (
  cust_code    varchar2(3)  primary key
, name         varchar2(50)
, region       varchar2(5)
)
;

Table CUSTOMERS created.

create table orders (
  ord_id       number(3)
, ord_date     date
, cust_code    varchar2(3)  references customers(cust_code) deferrable initially deferred
, date_of_dely date
)
;

Table ORDERS created.


insert into orders values (101, sysdate, 'AAA', sysdate + 7);

1 row inserted.

insert into customers values ('AAA', 'Some Name', 'MyReg');

1 row inserted.


commit;

Commit complete.