【问题标题】:How to find a table with a primary key with a certain column name in Microsoft SQL?如何在 Microsoft SQL 中查找具有特定列名的主键的表?
【发布时间】:2016-12-06 17:15:33
【问题描述】:

在 Microsoft SQL 中,如果我想获取有关具有特定列名的列出现在我的数据库中的位置的信息,我可以运行以下查询:

select * from information_schema.columns where column_name = 'XXXXX';

此查询返回有关出现具有名称的列的实例的大量信息,但我没有看到任何有关引用约束的信息。

我在下面尝试了一些其他查询,但似乎没有一个能产生我想要的信息:

select * from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
select * from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE

我想写一个这样的查询:

select table_schema, table_name from INFORMATION_SCHEMA.COLUMNS
where column_name = 'XXXXX' and IsPrimaryKey = 1;

编辑: 有人建议这个问题重复了一个关于查找给定表的主键的问题。这个问题是相关的,但有所不同,因为我开始知道列的名称(可能出现在许多表中)并且我希望能够判断是否存在具有相同名称的主键列的表。

【问题讨论】:

标签: sql-server tsql database-metadata


【解决方案1】:
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + CONSTRAINT_NAME), 'IsPrimaryKey') = 1
AND COLUMN_NAME = 'ColumnName' AND TABLE_SCHEMA = 'SchemaName'

【讨论】:

  • 不知道为什么这被否决了,但它有效。我会将table_name 更改为* 并删除and table_schema ... 不知道为什么会这样。 +1
【解决方案2】:
SELECT
    s.name AS schema_name,
    o.name AS table_name
    --, *
FROM sys.objects o
    join sys.schemas s on s.schema_id = o.schema_id
    join sys.indexes i on i.object_id = o.object_id
    join sys.index_columns ic  ON i.object_id = ic.object_id AND i.index_id = ic.index_id
    join sys.columns c ON ic.object_id = c.object_id AND c.column_id = ic.column_id
WHERE i.is_primary_key = 1
    and i.name = 'XXXXX';

编辑:

我写了第一种方法来表明 PK 并不总是单列,但忘记注意这一点并删除额外的行。这是返回单个结果的版本。

SELECT
    s.name AS schema_name,
    o.name AS table_name
    --, *
FROM sys.objects o
    join sys.schemas s on s.schema_id = o.schema_id
    join sys.indexes i on i.object_id = o.object_id
    --join sys.index_columns ic  ON i.object_id = ic.object_id AND i.index_id = ic.index_id
    --join sys.columns c ON ic.object_id = c.object_id AND c.column_id = ic.column_id
WHERE i.is_primary_key = 1
    and i.name = 'XXXXX';

编辑 2

正如 SqlZim 所指出的,最初的问题有点不清楚。如果您想按列名询问,我已添加该选项。警告:如果您有与 PK 具有相同列名的表,这将返回多个表。这很可能出现在较大的数据库和许多复合键中(例如,像 FinancialYear 这样的东西通常是许多复合键的一部分的金融系统)。

SELECT
    s.name AS schema_name,
    o.name AS table_name
    --, *
FROM sys.objects o
    join sys.schemas s on s.schema_id = o.schema_id
    join sys.indexes i on i.object_id = o.object_id
    join sys.index_columns ic  ON i.object_id = ic.object_id AND i.index_id = ic.index_id
    join sys.columns c ON ic.object_id = c.object_id AND c.column_id = ic.column_id
WHERE i.is_primary_key = 1
    and c.name = 'PROGRAM_YEAR';

【讨论】:

  • 要按列名搜索,它应该是c.name = ... 而不是i.name = ...,这意味着您确实需要最后两个连接。
  • 标题中的问题是如何根据主键名找到表。另一方面,他的“类似”查询表示列名。我将添加一个选项。
猜你喜欢
  • 2021-07-11
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 2010-09-16
相关资源
最近更新 更多