2016-12-06 49 views
2

在Microsoft SQL,如果我想获得其中具有一定的列名的列会出现在我的数据库中的信息,我可以运行此查询:如何在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; 

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

+0

如果您的PRIMARY_KEY是聚簇键,那么它就是表。 – DVT

+2

http://stackoverflow.com/questions/3930338/sql-server-get-table-primary-key-using-sql-query – SQLChao

+0

什么版本的SQL Server? –

回答

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' 
+0

不知道为什么这是downvoted,但它的作品。我会将'table_name'更改为'*'并删除'和table_schema ...'不知道为什么会出现这种情况。 +1 – SqlZim

1
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'; 

EDIT 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'; 
+0

要按列名搜索,它应该是'c.name = ...'而不是'i.name = ...'这意味着您确实需要最后两个连接。 – SqlZim

+0

标题中的问题是如何根据主键名找到表。另一方面,他的“类似”查询表示列名。我会添加一个选项。 – SMM

相关问题