Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Usenet -> c.d.o.server -> Re: select + insert vs. insert and catching exception
On Thu, 26 Sep 2002 21:09:15 GMT, Karsten Farell <kfarrell_at_medimpact.com> wrote:
>Okay, here's what I was thinking about when I wrote that. Perform this
>little test:
>
>create table t1 (
> pk number not null,
> constraint pk1 primary key (pk)
>);
>create table t2 (
> pk number not null,
> fk number
>);
>alter table t2 add (
> constraint fk2 foreign key (fk) references t1 (pk)
>);
>insert into t1 values (100);
>insert into t2 values (200, 100);
>update t1 set pk=999 where pk=100;
>ERROR at line 1:
>ORA-02292: integrity constraint (owner.FK2) violated - child record found
>
But you can avoid that one with deferrable constraints. Look:
SQL> DROP TABLE t2;
Tabelle wurde gelöscht.
SQL> DROP TABLE t1;
Tabelle wurde gelöscht.
SQL>
SQL> create table t1 (
2 pk number not null, 3 constraint pk1 primary key (pk)
Tabelle wurde angelegt.
SQL>
SQL> create table t2 (
2 pk number not null, 3 fk number
Tabelle wurde angelegt.
**Now add a deferrable FK:**
SQL>
SQL> alter table t2 add (
2 constraint fk2 3 foreign key (fk) 4 references t1 (pk) 5 DEFERRABLE 6 INITIALLY DEFERRED
Tabelle wurde geändert.
SQL>
SQL> insert into t1 values (100);
1 Zeile wurde erstellt.
SQL> insert into t2 values (200, 100);
1 Zeile wurde erstellt.
SQL> COMMIT; Transaktion mit COMMIT abgeschlossen.
SQL> **The following UPDATE doesn't result in an error:**
SQL> update t1 set pk=999 where pk=100;
1 Zeile wurde aktualisiert.
**Now update all childs (of course a trigger could do that):**
SQL> update t2 set fk=999 where fk=100;
1 Zeile wurde aktualisiert.
SQL> COMMIT; Transaktion mit COMMIT abgeschlossen.
Marc Blum
mailto:marc_at_marcblum.de
http://www.marcblum.de
Received on Sun Sep 29 2002 - 03:31:09 CDT