ops$tkyte@ORA10G> create table p
2 ( pk int primary key )
3 /
Table created.
ops$tkyte@ORA10G> create table c
2 ( fk constraint c_fk
3 references p(pk)
4 deferrable
5 initially immediate
6 )
7 /
Table created.第二条创建表C的语句看不太明白 好像没有字段啊
但是后面依然可以往里插入数据

解决方案 »

  1.   

    第二个语句创建了一个表,包含一个字段fk,由于是p表的外键,所以缺省情况下用p表pk字段的类型,也是int,在oracle中就是number(38),用
    命令
    SQL>desc c
    看一下就知道。至于deferrable initially immediate都是描述外键的属性,其中deferrable说明此外键是可延迟的,即对完整性的判断可以到commit时再进行。initially immediate说明对于上面的延迟性约束,在执行完一个sql语句后立即检查,而如果是initially deferred,则到commit时再检查。
      

  2.   


    有个地方看不明白 deferrable  说明此外键是可延迟的,对完整性的判断可以到commit时再进行
    initially immediate 在执行完一个sql语句后立即检查,
    这两个放在一起不是矛盾了吗
    一个是commit才检查,一个sql执行完了就检查
      

  3.   

    谢谢#2的回答 我明白了对于#4的疑问的回答
    ==================================
    约束的状态是可以通过命令更改的
    initially immediate 只是指定了此约束初始化是immediate 的
    你将来需要的话可以更改为deferrable  
      

  4.   


    initially immediate和initically deferred指的是在约束的状态为deferrable的情况下,最开始(initically)是立即检查还是commit时检查,immediate和deferred可利用sqlplus命令
    SET CONSTRAINT
    来修改,如对楼主的例子,可以这样修改其状态SET CONSTRAINT c_fk DEFERRED;
    SET CONSTRAINT c_fk IMMEDIATE;
      

  5.   

    奇怪了 我的怎么不能这样创建表
    错误是
    ORA-02253:此处不允许约束条件说明就是第二行2 ( fk constraint c_fk  出错