我有一些带有主键和外键的Sybase ASE表,我想获得这些表的REAL PK和FK列表。此信息应通过SELECT查询返回到系统表。 所有使用查询到' syskeys'的查询由于syskeys仅包含通过sp_foreignkey创建的表的逻辑引用,因此不正确。 例如,我有以下表格:
create table tbl_pk1
(col1 int primary key,
col2 int);
create table tbl_pk3
(col1 int null,
col2 int);
sp_primarykey 'tbl_pk3', 'col1'
以下查询仅返回' tbl_pk3'。
select t.name from syskeys i INNER JOIN sysobjects t ON i.id = t.id where t.name in ('tbl_pk1', 'tbl_pk3')
我知道什么' sp_helpconstraint'程序可以帮助我,但我不能在SELECT中调用它。 也许有人可以帮我查询系统表以获取有关表的主键和外键的实际信息?
答案 0 :(得分:0)
以下是如何做到的
select user_name(o.uid) user_name, object_name(i.id) table_name, index_col(object_name(i.id), i.indid, 1) column_name, 1 column_id, i.name as con_name
from sysindexes i, sysobjects o where object_name(i.id) = 'tbl_pk_mult' and user_name(o.uid) = 'dbo' and status & 2048 = 2048 and i.id = o.id and index_col(object_name(i.id), i.indid, 1) is not null union
select user_name(o.uid) user_name, object_name(i.id) table_name, index_col(object_name(i.id), i.indid, 2) column_name, 2 column_id, i.name as con_name
from sysindexes i, sysobjects o where object_name(i.id) = 'tbl_pk_mult' and user_name(o.uid) = 'dbo' and status & 2048 = 2048 and i.id = o.id and index_col(object_name(i.id), i.indid, 2) is not null union
select user_name(o.uid) user_name, object_name(i.id) table_name, index_col(object_name(i.id), i.indid, 3) column_name, 3 column_id, i.name as con_name
from sysindexes i, sysobjects o where object_name(i.id) = 'tbl_pk_mult' and user_name(o.uid) = 'dbo' and status & 2048 = 2048 and i.id = o.id and index_col(object_name(i.id), i.indid, 3) is not null union
select user_name(o.uid) user_name, object_name(i.id) table_name, index_col(object_name(i.id), i.indid, 4) column_name, 4 column_id, i.name as con_name
from sysindexes i, sysobjects o where object_name(i.id) = 'tbl_pk_mult' and user_name(o.uid) = 'dbo' and status & 2048 = 2048 and i.id = o.id and index_col(object_name(i.id), i.indid, 4) is not null union
select user_name(o.uid) user_name, object_name(i.id) table_name, index_col(object_name(i.id), i.indid, 5) column_name, 5 column_id, i.name as con_name
from sysindexes i, sysobjects o where object_name(i.id) = 'tbl_pk_mult' and user_name(o.uid) = 'dbo' and status & 2048 = 2048 and i.id = o.id and index_col(object_name(i.id), i.indid, 5) is not null union
select user_name(o.uid) user_name, object_name(i.id) table_name, index_col(object_name(i.id), i.indid, 6) column_name, 6 column_id, i.name as con_name
from sysindexes i, sysobjects o where object_name(i.id) = 'tbl_pk_mult' and user_name(o.uid) = 'dbo' and status & 2048 = 2048 and i.id = o.id and index_col(object_name(i.id), i.indid, 6) is not null union
select user_name(o.uid) user_name, object_name(i.id) table_name, index_col(object_name(i.id), i.indid, 7) column_name, 7 column_id, i.name as con_name
from sysindexes i, sysobjects o where object_name(i.id) = 'tbl_pk_mult' and user_name(o.uid) = 'dbo' and status & 2048 = 2048 and i.id = o.id and index_col(object_name(i.id), i.indid, 7) is not null union
select user_name(o.uid) user_name, object_name(i.id) table_name, index_col(object_name(i.id), i.indid, 8) column_name, 8 column_id, i.name as con_name
from sysindexes i, sysobjects o where object_name(i.id) = 'tbl_pk_mult' and user_name(o.uid) = 'dbo' and status & 2048 = 2048 and i.id = o.id and index_col(object_name(i.id), i.indid, 8) is not null union
select user_name(o.uid) user_name, object_name(i.id) table_name, index_col(object_name(i.id), i.indid, 9) column_name, 9 column_id, i.name as con_name
from sysindexes i, sysobjects o where object_name(i.id) = 'tbl_pk_mult' and user_name(o.uid) = 'dbo' and status & 2048 = 2048 and i.id = o.id and index_col(object_name(i.id), i.indid, 9) is not null union
select user_name(o.uid) user_name, object_name(i.id) table_name, index_col(object_name(i.id), i.indid, 10) column_name, 10 column_id, i.name as con_name
from sysindexes i, sysobjects o where object_name(i.id) = 'tbl_pk_mult' and user_name(o.uid) = 'dbo' and status & 2048 = 2048 and i.id = o.id and index_col(object_name(i.id), i.indid, 10) is not null union
select user_name(o.uid) user_name, object_name(i.id) table_name, index_col(object_name(i.id), i.indid, 11) column_name, 11 column_id, i.name as con_name
from sysindexes i, sysobjects o where object_name(i.id) = 'tbl_pk_mult' and user_name(o.uid) = 'dbo' and status & 2048 = 2048 and i.id = o.id and index_col(object_name(i.id), i.indid, 11) is not null union
select user_name(o.uid) user_name, object_name(i.id) table_name, index_col(object_name(i.id), i.indid, 12) column_name, 12 column_id, i.name as con_name
from sysindexes i, sysobjects o where object_name(i.id) = 'tbl_pk_mult' and user_name(o.uid) = 'dbo' and status & 2048 = 2048 and i.id = o.id and index_col(object_name(i.id), i.indid, 12) is not null union
select user_name(o.uid) user_name, object_name(i.id) table_name, index_col(object_name(i.id), i.indid, 13) column_name, 13 column_id, i.name as con_name
from sysindexes i, sysobjects o where object_name(i.id) = 'tbl_pk_mult' and user_name(o.uid) = 'dbo' and status & 2048 = 2048 and i.id = o.id and index_col(object_name(i.id), i.indid, 13) is not null union
select user_name(o.uid) user_name, object_name(i.id) table_name, index_col(object_name(i.id), i.indid, 14) column_name, 14 column_id, i.name as con_name
from sysindexes i, sysobjects o where object_name(i.id) = 'tbl_pk_mult' and user_name(o.uid) = 'dbo' and status & 2048 = 2048 and i.id = o.id and index_col(object_name(i.id), i.indid, 14) is not null union
select user_name(o.uid) user_name, object_name(i.id) table_name, index_col(object_name(i.id), i.indid, 15) column_name, 15 column_id, i.name as con_name
from sysindexes i, sysobjects o where object_name(i.id) = 'tbl_pk_mult' and user_name(o.uid) = 'dbo' and status & 2048 = 2048 and i.id = o.id and index_col(object_name(i.id), i.indid, 15) is not null union
select user_name(o.uid) user_name, object_name(i.id) table_name, index_col(object_name(i.id), i.indid, 16) column_name, 16 column_id, i.name as con_name
from sysindexes i, sysobjects o where object_name(i.id) = 'tbl_pk_mult' and user_name(o.uid) = 'dbo' and status & 2048 = 2048 and i.id = o.id and index_col(object_name(i.id), i.indid, 16) is not null
答案 1 :(得分:-1)
我使用Sybase ASA(不是ASE),但您可以尝试此查询(它适用于ASA)。
对于外键:
select f.* from sys.systable t
join sys.SYSFOREIGNKEY f on t.table_id=f.primary_table_id
where t.table_name='xxx'
主键:
select c.* from sys.systable t
join sys.SYSCONSTRAINT c on t.object_id=c.table_object_id
where t.table_name='xxx' and c.constraint_type='P'