我现在知道两个表的所有信息,而且一张表的主键是另一张表的外键。(除了外键约束的名称)我现在怎样获得外间名称?因为原来有A、B、C三张表,A的一个字段是引用B的主键作为外键。我现在要删除这个外键约束,但有好几个数据库。我不确定这个外键的名称在不同的数据库中是不是一样。我能不能使用sql先获得这个外键的名称?

解决方案 »

  1.   

    我使用的是toad,可以查看建表脚本,在脚本里面写的很清楚,外键是什么,关联到哪
    使用sql语句应该也可以吧,网上搜搜
      

  2.   

    select constraint_name from user_constraints where constraint_type='R' and table_name='A'
      

  3.   


    SELECT ou.NAME owner, oc.NAME constraint_name,
           o.NAME table_name, ru.NAME r_owner, rc.NAME r_constraint_name,
           rcobj.NAME r_table_name,
           DECODE(c.TYPE#, 4,
                  DECODE(c.refact, 1, 'CASCADE', 2, 'SET NULL', 'NO ACTION'),
                  NULL) delete_rule,
           DECODE(c.TYPE#, 5, 'ENABLED',
                  DECODE(c.enabled, NULL, 'DISABLED', 'ENABLED')) status,
           DECODE(BITAND(c.defer, 1), 1, 'DEFERRABLE', 'NOT DEFERRABLE') DEFERRABLE,
           DECODE(BITAND(c.defer, 2), 2, 'DEFERRED', 'IMMEDIATE') DEFERRED,
           DECODE(BITAND(c.defer, 4), 4, 'VALIDATED', 'NOT VALIDATED') validated,
           DECODE(rcdef.TYPE#, 2, 'PK', 3, 'U') R_constraint_type
    FROM sys.con$ oc, sys.con$ rc, sys.USER$ ou, sys.USER$ ru,
         sys.obj$ o, sys.cdef$ c, sys.cdef$ rcdef, sys.obj$ rcobj
    WHERE oc.owner# = ou.USER#
      AND oc.con# = c.con#
      AND c.obj# = o.obj#
      AND c.rcon# = rc.con#
      AND rc.owner# = ru.USER#
      AND c.TYPE# = 4
      AND rcdef.con# = rc.con#
      AND rcobj.obj# = rcdef.obj#
      AND rcdef.TYPE# IN (2,3)
      AND ru.NAME = :user
      AND rcobj.NAME = :table
    order by 1,3
      

  4.   

    这是从TOAD查看外键语句截取的
    其中两个变量
    :user 为你要查的表所在用户
    :table 为表名
      

  5.   

    这样是可以,但是有点多余,为了删除约束而把约束基于的列整个删掉,有点于是玉石俱焚的意思..特别是数据量大的话,性能太低
    可以写个过程,取出约束名,动态语句drop掉
      

  6.   

    declare
    forgkey varchar2(20);
    sqlstr varchar2(1000);
    begin
    select a.constraint_name into forgkey from user_constraints a,user_constraints b
    where a.r_constraint_name=b.constraint_name
      and a.constraint_type='R'
      and a.table_name='A'
      and b.table_name='B';
    execute immediate 'alter table a drop constraint '||forgkey;
    end;