我需要编写一个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> Customer
为cust_code
Foreign Key
中的Orders
为cust_code
答案 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.