如何从Informix中的名称获取约束详细信息?

use*_*039 4 database informix constraints

在编写大型事务(大量插入,删除,更新)并因此违反Informix中的约束(v10,但也应该适用于其他版本)时,我得到一个不太有用的消息,例如,我违反了约束r190_710.如何找出某个约束所涵盖的表和键,我只知道名称?

Jon*_*ler 6

Tony Andrews建议(指向URL的不同终点):

Informix指南到SQL:参考它应该看看系统目录表SYSCONSTRAINTS和SYSINDICES.

该手册中描述了Informix系统目录.

SysConstraints表是分析约束的起点,最肯定的是; 您在该表中找到约束名称,然后您可以从中找到其他详细信息.

但是,您还必须查看其他表,而不仅仅是(甚至直接)SysIndices.

例如,我对数据库中的表有很多NOT NULL约束.对于那些,约束类型是'N',并且不需要在别处寻找更多信息.

约束类型"P"表示主键; 需要通过SysIndexes视图或SysIndices表进行更多分析.类似地,约束类型"U"表示唯一约束,并且需要来自SysIndexes视图或SysIndices表的额外信息.

约束类型"C"表示检查约束; 约束的文本(和二进制编译形式)可以在SysChecks表中找到(数据类型为'T'和'B';数据或多或少用Base-64编码,但没有'='填充在最后并使用62和63的不同字符).

最后,约束类型"R"表示参照完整性约束.您可以使用SysReferences表来查找引用的表,并使用SysIndexes或SysIndices来确定使用引用表和引用表上的哪些索引,从中可以发现相关列.这可能会变得很毛茸茸!


小智 6

表中具有约束的列

SELECT
    a.tabname, b.constrname, d.colname
FROM
    systables a, sysconstraints b, sysindexes c, syscolumns d
WHERE
    a.tabname = 'your_table_name_here'
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
)
ORDER BY
    a.tabname, 
    b.constrname,
    d.colname
Run Code Online (Sandbox Code Playgroud)


Ton*_*ews 0

Informix Guide to SQL: Reference看来,您应该查看系统目录表 SYSCONSTRAINTS 和 SYSINDICES。