Из серфинга на www.iiug.org (Международная группа пользователей Informix) я нашел не очень простое решение.
(1) Получить ссылочные данные ограничения из имени ограничения (вы можете получить все ограничения для таблицы, заменив «AND sc.constrname =?» На «AND st.tabname MATCHES?»). Этот оператор выбирает здесь больше полей, чем необходимо, потому что они могут быть интересны в других ситуациях.
SELECT si.part1, si.part2, si.part3, si.part4, si.part5,
si.part6, si.part7, si.part8, si.part9, si.part10,
si.part11, si.part12, si.part13, si.part14, si.part15, si.part16,
st.tabname, rt.tabname as reftable, sr.primary as primconstr,
sr.delrule, sc.constrid, sc.constrname, sc.constrtype,
si.idxname, si.tabid as tabid, rc.tabid as rtabid
FROM 'informix'.systables st, 'informix'.sysconstraints sc,
'informix'.sysindexes si, 'informix'.sysreferences sr,
'informix'.systables rt, 'informix'.sysconstraints rc
WHERE st.tabid = sc.tabid
AND st.tabtype != 'Q'
AND st.tabname NOT MATCHES 'cdr_deltab_[0-9][0-9][0-9][0-9][0-9][0-9]*'
AND rt.tabid = sr.ptabid
AND rc.tabid = sr.ptabid
AND sc.constrid = sr.constrid
AND sc.tabid = si.tabid
AND sc.idxname = si.idxname
AND sc.constrtype = 'R'
AND sc.constrname = ?
AND sr.primary = rc.constrid
ORDER BY si.tabid, sc.constrname
(2) Используйте part1-part16, чтобы определить, на какой столбец влияет ограничение: часть [n], содержащая значение, отличное от 0, содержит номер столбца используемого столбца. Используйте (3), чтобы найти имя столбца.
Если constrtype равен 'R' (ссылка), используйте следующую инструкцию, чтобы найти части таблицы ссылки:
SELECT part1, part2, part3, part4, part5, part6, part7, part8,
part9, part10, part11, part12, part13, part14, part15, part16
FROM 'informix'.sysindexes si, 'informix'.sysconstraints sc
WHERE si.tabid = sc.tabid
AND si.idxname = sc.idxname
AND sc.constrid = ? -- primconstr from (1)
(3) tabid и rtabid (для ссылки на ограничения) из (1) теперь могут использоваться для получения столбцов таблиц следующим образом:
SELECT colno, colname
FROM 'informix'.syscolumns
WHERE tabid = ? -- tabid(for referenced) or rtabid(for referencing) from (1)
AND colno = ? -- via parts from (1) and (2)
ORDER BY colno
(4) Если constrtype равен 'C', тогда получите информацию о проверке, например:
SELECT type, seqno, checktext
FROM 'informix'.syschecks
WHERE constrid = ? -- constrid from (1)
Довольно волосатый, действительно