【问题标题】:SQL to retrieve column info including referencesSQL 检索列信息,包括引用
【发布时间】:2014-04-19 16:22:09
【问题描述】:

我正在尝试查询数据库架构以检索有关列配置的信息。包含在结果集中我想要一个引用列的外键列表。希望这里有人可能会在我的查询中发现一个错误,它总是返回一个空集。

SELECT

C.ORDINAL_POSITION          AS `position`,
C.COLUMN_DEFAULT            AS `default`,
C.IS_NULLABLE               AS `nullable`,
C.CHARACTER_MAXIMUM_LENGTH  AS `max`,
C.NUMERIC_PRECISION         AS `size`,
C.NUMERIC_SCALE             AS `scale`,
C.COLUMN_TYPE               AS `type`,
U.TABLE_NAME                AS `referenced`,

CASE C.COLUMN_NAME WHEN NULL
  THEN U.REFERENCED_COLUMN_NAME
  ELSE C.COLUMN_NAME
END AS `name`

 FROM INFORMATION_SCHEMA.COLUMNS AS C
 RIGHT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS U
   ON U.REFERENCED_TABLE_SCHEMA = C.TABLE_SCHEMA
   AND U.REFERENCED_TABLE_NAME = C.TABLE_NAME
 WHERE C.TABLE_NAME = 'my_table'
   AND C.TABLE_SCHEMA = 'my_database'
 ORDER BY `position` ASC

【问题讨论】:

  • 你应该使用LEFT JOIN,而不是RIGHT JOIN
  • @Barmar 左连接不会只返回一个引用吗?
  • 它们都返回所有匹配项。不同之处在于没有匹配时会发生什么——左连接返回第一个表中的所有行,右连接返回第二个表中的所有行。
  • @Barmar 也许我自己搞糊涂了。我知道左边会有一个条目,右边会有零个或多个条目。我想我需要一个右连接,从右边返回值(左边为空),但包括公用表名:/

标签: mysql information-schema


【解决方案1】:

你需要一个LEFT JOIN:

SELECT

    C.ORDINAL_POSITION          AS `position`,
    C.COLUMN_NAME               AS `name`
    C.COLUMN_DEFAULT            AS `default`,
    C.IS_NULLABLE               AS `nullable`,
    C.CHARACTER_MAXIMUM_LENGTH  AS `max`,
    C.NUMERIC_PRECISION         AS `size`,
    C.NUMERIC_SCALE             AS `scale`,
    C.COLUMN_TYPE               AS `type`,
    U.TABLE_NAME                AS `referencing_table`,
    U.COLUMN_NAME               AS `referencing_column`

 FROM INFORMATION_SCHEMA.COLUMNS AS C
 LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS U
   ON U.REFERENCED_TABLE_SCHEMA = C.TABLE_SCHEMA
  AND U.REFERENCED_TABLE_NAME = C.TABLE_NAME
 WHERE C.TABLE_NAME = 'my_table'
   AND C.TABLE_SCHEMA = 'my_database'
 ORDER BY `position` ASC

LEFT JOIN 返回 INNER JOIN 将返回的所有行。此外,它返回左表 (COLUMNS) 中不匹配的所有行,以及右表中列的 NULL 值。

【讨论】:

  • 感谢您解决这个问题。所有这些连接都是我喜欢使用 ORM 的原因。
猜你喜欢
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
相关资源
最近更新 更多