【问题标题】:db: find table name by iddb:通过 id 查找表名
【发布时间】:2011-09-21 09:11:14
【问题描述】:

可以通过 id 找到表名吗? 我有多个表扩展另一个表,当我在“超级”表中找到 id 时,我想知道那个 id 在哪个子表中。 有一种方法可以通过索引来做到这一点还是其他方式? 谢谢

【问题讨论】:

  • 除非您动态地创建这些表,否则我看不出选择任何类型的索引来识别表的意义,您可以通过它的名称轻松识别表。否则,如果我没有正确理解您的问题,您可能看起来像这样:SELECT relid, relname FROM pg_stat_all_tables where schemaname = 'YourSchema';
  • 解释一下我可以写一个例子:我有一个表叫做文章和两个表叫做新闻和课程。文章包含新闻和课程的公共信息以及 id。文章 id 1 指的是 id 为 1 的新闻或课程。为避免在两个表上进行选择以查找 id 1,我想知道表名以直接在该表上进行查询。

标签: mysql sql database postgresql indexing


【解决方案1】:

您的示例确实不清楚,但是...

文章(东西,id) 新闻(id 参考文章(id),morestuff) 课程(id 参考文章(id),evenmorestuff)

所以您使用文章中的 id 链接到新闻或课程,并希望避免从新闻和课程中选择联合?

1) 您当前的查询不包含此信息

2) 几种方法:

a) 您将数据模型更改为更通用的数据模型(文章、r_article_news、新闻、r_article_courses、课程)并在此基础上确定

b) 您在文章表中添加信息(添加一个名为 type 的列,您将在其中输入新闻或课程)

c) 你让你的第一个查询稍微重一点来自动确定

SELECT a.*,b.type 
FROM article a 
INNER JOIN 
    (SELECT id,'news' AS type 
    FROM news 
    UNION 
    SELECT id,'courses' AS type 
    FROM courses) b 
ON a.id=b.id;

【讨论】:

    【解决方案2】:

    标签上写着mysqlpostgresql。由于不清楚你想要哪一个,这里是mysql的解决方案。

    显然,只有当您的表设置了 FOREIGN KEYS 时,您才能执行此操作。例如,如果您有一个包含两个表的数据库dogs_and_peaople

    dogs
    ------
    id
    owner_id -- foreign key on people.id
    name
    
    people
    ------
    id
    name
    surname
    

    如果你想知道dogs.owner_id重复了哪个表和字段,你可以在information_schema数据库中查看,如下所示:

    SELECT 
        REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
    FROM
        information_schema.KEY_COLUMN_USAGE
    WHERE
        CONSTRAINT_SCHEMA = 'dogs_and_peaople' -- database name
        AND TABLE_NAME = 'dogs'
        AND COLUMN_NAME = 'owner_id'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      • 2019-08-16
      • 2010-12-13
      • 1970-01-01
      相关资源
      最近更新 更多