关于主外键表数据提交过程中的一点疑惑
一直有疑问,Oracle是基于事务的,事务内的所有操作必须一次性提交,要么成功要么失败。
建了一张简单的主表和引用表,如果分开插入数据并提交当然是没问题的,问题就在于放在一个事务内去提交的话,假设主表先插数据,但是应该还没有写入到数据库中,然后再引用表中再插入数据,为什么能够一次性提交成功或者失败呢? 还没有写到主表中,当然写引用表的时候会缺乏关联关系啊,不过事实上已经成功了
还有类似的操作
例如
Insert into temptable select 1 from onetable;
Insert into temptable select count(*) from temptable;
事实上已经按照顺序写入了
-- Create table
create table ChildTable
(
ID number(20,0),
Name Varchar2(20)
);
-- Create/Recreate primary, unique and foreign key constraints
alter table ChildTable
add constraint ChildTablePrimarykey primary key (ID);
-- Create table
create table MainTable
(
ID number(20,0),
ForeignID number(20,0),
Name Varchar2(20)
);
-- Create/Recreate primary, unique and foreign key constraints
alter table MainTable
add constraint MainTablePrimarykey primary key (ID);
-- Create/Recreate primary, unique and foreign key constraints
alter table MAINTABLE
add constraint MainTableForeignKEY foreign key (ForeignID)
references ChildTable (ID);
INSERT INTO ChildTable VALUES(1,'ChildA');
COMMIT;
INSERT INTO MainTable VALUES(1,1,'MainA');
COMMIT;
-- Created on 2008-1-9 by bq_wang
BEGIN
-- Test statements here
SAVEPOINT do_insert;
INSERT INTO ChildTable VALUES(2,'ChildA');
INSERT INTO MainTable VALUES(2,2,'MainA');
COMMIT WORK ;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK TO do_insert;
DBMS_OUTPUT.put_line('ERROR');
END;
|