在不知道 Informix 中的外键名称的情况下,在两个表的列之间删除外键约束?

Drop a foreign key constraint between columns of two tables without knowing the foreign key name in Informix?

我正在使用 Informix 数据库。我在 table 中添加了一些外键,但没有给它们命名,例如

ALTER TABLE myreport
  ADD CONSTRAINT FOREIGN KEY (rid) REFERENCES report(id),
  ADD CONSTRAINT FOREIGN KEY (uid) REFERENCES user(id);

现在我想删除usertable的uidid之间的外键。

我可以使用以下方法获取 table 上的约束名称:

SELECT constrname
  FROM sysconstraints
 WHERE tabid = (SELECT tabid FROM systables WHERE tabname = 'myreport');

给出以下输出:

constrname  u169_201    
constrname  n169_202
constrname  n169_203
constrname  n169_204
constrname  n169_205
constrname  n169_206
constrname  n169_207
constrname  r169_276
constrname  r169_277

不知道usertable的uidid之间的外键属于哪个约束。

尝试使用 sysreferences 目录 table。类似这样的内容应该可以为您提供所需的信息:

SELECT
    c_a.constrname AS Constraint_name
    , t_a.tabname AS ForeignKey_table
    , i_a.idxname AS ForeignKey_index
    , t_b.tabname AS PrimaryKey_table
    , i_b.idxname AS PrimaryKey_index 
FROM
    sysreferences AS r
    INNER JOIN sysconstraints AS c_a
    ON 
        r.constrid = c_a.constrid
    INNER JOIN systables AS t_a
    ON 
        c_a.tabid = t_a.tabid
    INNER JOIN systables AS t_b
    ON 
        r.ptabid = t_b.tabid
    INNER JOIN sysindexes AS i_a
    ON
        c_a.idxname = i_a.idxname
    INNER JOIN sysconstraints AS c_b
    ON
        r.primary = c_b.constrid
    INNER JOIN sysindexes AS i_b
    ON
        c_b.idxname = i_b.idxname 
WHERE
    t_a.tabname = 'YOUR_TABLE_HERE';

我试过它有效:

CREATE PROCEDURE INFORMIX.REMOVE_FK()
    DEFINE tmpvr varchar(250);
    FOREACH cur1 FOR select  b.constrname into tmpvr
            from systables a, sysconstraints b, sysindexes c, syscolumns d
            WHERE a.tabname = 'myreport' AND (d.colname='uid' or d.colname='rid')
            AND b.tabid = a.tabid AND c.idxname = b.idxname AND d.tabid = a.tabid AND (
                d.colno = c.part1 or d.colno = c.part2 or d.colno = c.part3 or d.colno = c.part4 or
                d.colno = c.part5 or d.colno = c.part6 or d.colno = c.part7 or d.colno = c.part8 or
                d.colno = c.part9 or d.colno = c.part10 or d.colno = c.part11 or d.colno = c.part12 or
                d.colno = c.part13 or d.colno = c.part14 or d.colno = c.part15 or d.colno = c.part16
            )
    EXECUTE IMMEDIATE 'ALTER TABLE myreport DROP CONSTRAINT (' || tmpvr || ')';
    END FOREACH
END PROCEDURE;
EXECUTE PROCEDURE INFORMIX.REMOVE_FK();
DROP PROCEDURE INFORMIX.REMOVE_FK();