AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 2837
Accepted
René Nyffenegger
René Nyffenegger
Asked: 2011-05-21 01:54:22 +0800 CST2011-05-21 01:54:22 +0800 CST 2011-05-21 01:54:22 +0800 CST

如何识别具有指向 Sybase 中特定表的外键的表?

  • 772

我正在寻找(最好)一个 SQL 语句,它为任何具有 Sybase 中给定表的外键的表选择表/列名。我认为表格应该以某种方式成为可能,sys...但是对于 sybase 来说是全新的,我无法完全理解它。因此,我们非常感谢对正确方向的任何帮助。

编辑:为了完整起见:SELECT @@VERSION返回

'Adaptive Server Enterprise/15.0.3/EBF 17156 ESD#3/P/Sun_svr4/OS 5.8/ase1503/2726/64-bit/FBO/Fri Feb 5 05:26:23 2010'

编辑 2
非常感谢您的建议,尤其是Andrew Bickerton 的评论。这使我能够构建一个基本的 SQL 选择语句,作为进一步发展的起点。

如果其他人对此感兴趣,这里是:

select 
  fko.name    "Foreign key name",
  par.name    "Referenced table name",
  fk1.name || ' -> ' || pk1.name "Reference 1",
  fk2.name || ' -> ' || pk2.name "Reference 2",
  fk3.name || ' -> ' || pk3.name "Reference 3",
  fk4.name || ' -> ' || pk4.name "Reference 4"
from 
  sysobjects      tab                                       join
  sysconstraints  con on tab.id        = con.tableid        join
  sysobjects      fko on con.constrid  = fko.id             join
  sysreferences   ref on con.constrid  = ref.constrid       join
  sysobjects      par on par.id        = ref.reftabid  left join
  ---- 1. Column
  syscolumns      fk1 on ref.fokey1    = fk1.colid and
                         ref.tableid   = fk1.id        left join
  syscolumns      pk1 on ref.refkey1   = pk1.colid and
                         ref.reftabid  = pk1.id        left join
  ---- 2. Column
  syscolumns      fk2 on ref.fokey2    = fk2.colid and
                         ref.tableid   = fk2.id        left join
  syscolumns      pk2 on ref.refkey2   = pk2.colid and
                         ref.reftabid  = pk2.id        left join
  ---- 3. Column
  syscolumns      fk3 on ref.fokey3    = fk3.colid and
                         ref.tableid   = fk3.id        left join
  syscolumns      pk3 on ref.refkey3   = pk3.colid and
                         ref.reftabid  = pk3.id        left join
  ---- 4. Column
  syscolumns      fk4 on ref.fokey4    = fk4.colid and
                         ref.tableid   = fk4.id        left join
  syscolumns      pk4 on ref.refkey4   = pk4.colid and
                         ref.reftabid  = pk4.id        -- Et cetera...
where
  tab.type = 'U'      and
  tab.name = 'tq84_f' and
  fko.type = 'RI'
sybase referential-integrity
  • 4 4 个回答
  • 18157 Views

4 个回答

  • Voted
  1. Best Answer
    Andrew Bickerton
    2011-05-21T02:14:18+08:002011-05-21T02:14:18+08:00

    自从我在 sybase 工作以来已经有一段时间了,但是(从记忆中)以下 sql 应该为您指明正确的方向:

    select *
    from sysobjects so inner join syscolumns sc on so.id = sc.id 
    where sc.name = 'field name'
    

    您还可以在线查看sybase 书籍(系统表)

    • 4
  2. ruir3
    2012-04-13T04:58:10+08:002012-04-13T04:58:10+08:00

    另一种方法是“sp_depends”

    Sybase URL: http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.sprocs/html/sprocs/ sprocs68.htm

    • 2
  3. Henri
    2012-11-03T05:12:14+08:002012-11-03T05:12:14+08:00

    请注意,上面显示的方法(使用 sysconstraints 和 sysreferences)仅在您有引用约束时才有效。如果您只定义了一个外键但没有约束,您将不会在那里看到它。要获取与给定表相关的所有外键,可以使用 syskeys:

    select  rtrim(object_name(k.id)),
        rtrim(substring(col_name(k.depid, depkey1),sign(keycnt),30))
        +rtrim(substring(', '+col_name(k.depid, depkey2),sign(keycnt-1),30))
        +rtrim(substring(', '+col_name(k.depid, depkey3),sign(keycnt-2),30))
        +rtrim(substring(', '+col_name(k.depid, depkey4),sign(keycnt-3),30))
        +rtrim(substring(', '+col_name(k.depid, depkey5),sign(keycnt-4),30))
        +rtrim(substring(', '+col_name(k.depid, depkey6),sign(keycnt-5),30))
        +rtrim(substring(', '+col_name(k.depid, depkey7),sign(keycnt-6),30))
        +rtrim(substring(', '+col_name(k.depid, depkey8),sign(keycnt-7),30)),
        rtrim(substring(col_name(k.id, key1),sign(keycnt),30))
        +rtrim(substring(', '+col_name(k.id, key2),sign(keycnt-1),30))
        +rtrim(substring(', '+col_name(k.id, key3),sign(keycnt-2),30))
        +rtrim(substring(', '+col_name(k.id, key4),sign(keycnt-3),30))
        +rtrim(substring(', '+col_name(k.id, key5),sign(keycnt-4),30))
        +rtrim(substring(', '+col_name(k.id, key6),sign(keycnt-5),30))
        +rtrim(substring(', '+col_name(k.id, key7),sign(keycnt-6),30))
        +rtrim(substring(', '+col_name(k.id, key8),sign(keycnt-7),30))
    from    syskeys k
    where   k.type = 2
    and     k.depid = object_id('report')
    

    (用您的表格名称替换报告)。

    第一列返回的是表名,外键指向该表。第二列是此表中的列列表。第三列是引用表中的列表列名。

    因此,如果您有一个 people_report 表,其中列 rep_key 是 report.key 的外键,您会得到如下内容:

    people_report        key       rep_key
    
    • 2
  4. Roberto Montenegro
    2015-08-13T09:20:15+08:002015-08-13T09:20:15+08:00

    如果您只是在寻找引用的表名称,此代码将有所帮助

    SELECT o.name
    FROM sysobjects o
    WHERE EXISTS (  SELECT 1 FROM sysconstraints C
        JOIN sysreferences R ON R.constrid=C.constrid
        WHERE EXISTS ( SELECT 1 FROM sysobjects o2
            WHERE o2.id=C.tableid
            AND o2.name ='tableName' )  
    AND R.reftabid=o.id )
    
    • 1

相关问题

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve