大家有没有碰到过下面的问题:
  比如一个table A(C1,C2,C3)
  其中PK:C1+C2 (默认是not null)然后我对这个表进行如下操作
  1.disable PK,disable FK
  2.update A.C3(全表更新)
  3.enable FK,enable PK进行完如上操作后,PK,FK全部enable了
但是出现了一个奇怪的问题:(C1,C2都变成nullable)
但是实际的数据C1,C2都是非空的,而且PK也是enabled了请大侠帮忙!

解决方案 »

  1.   

    这里估计是disable的时候,已经把c1,c2的not null拿走了。然后enable的时候,c1,c2是联合PK,所以不需要单个的not null的checking,所以就这样了。如果感兴趣的话做个sql trace或者10046的trace。
      

  2.   

    但是很奇怪,我第一次这样操作有这种情况,然后我手工把not null加上去之后再反复这样的操作都不会出现这种情况了
    (当中更新数据这步没有做)
      

  3.   


    正常的啊,因为你disable PK的时候C1,C2就不是主键了,默认C1,C2都变成了 nullable
    后来你再加上enable PK,这时由于你的PK是联合主键C1,C2,因此Oracle对单独的C1,C2没有限制必须是 not null
      

  4.   

    联合主键只是要求组合起来唯一,没要求各字段不能为null.当然全部为null是不可以的.
      

  5.   


    既然默认变成nullable,那为什么我之后反复之前的操作,pk仍旧还是not null呢?
    所不通呀!
      

  6.   

    你都取消了主键约束 就等于取消了not null属性
    况且你的是联合主键 只要唯一 其中一个为null是正常的 除非字段定义的时候就not null
      

  7.   


    既然主键应该字段不允许为空吧,
    我新建了一个表,也是联合主键,但是我去手工把联合主键中的一个更新成nullable都是不允许的呀?!!
      

  8.   

    是不是我oracle学的不好啊,
    我晚上查了一下主键的定义:
    主键就是自己设定的字段,该字段不能为空,而且该字段的值必须唯一
    那为什么主键有能更新成nullable呢,郁闷!