如何确定列是不是在其表的主键中? (SQL 服务器)

Posted

技术标签:

【中文标题】如何确定列是不是在其表的主键中? (SQL 服务器)【英文标题】:How do I determine if a column is in the primary key of its table? (SQL Server)如何确定列是否在其表的主键中? (SQL 服务器) 【发布时间】:2010-09-18 08:15:15 【问题描述】:

我目前正在使用...

select Table_Name, Column_name, data_type, is_Nullable
from information_Schema.Columns

...确定有关给定数据库中列的信息,以生成数据访问层。

我可以从哪里检索有关这些列是否是其表主键中的参与者的信息?

【问题讨论】:

【参考方案1】:

这是一种方法(将“keycol”替换为您正在搜索的列名 为):

SELECT  K.TABLE_NAME ,
    K.COLUMN_NAME ,
    K.CONSTRAINT_NAME
FROM    INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS C
        JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS K ON C.TABLE_NAME = K.TABLE_NAME
                                                         AND C.CONSTRAINT_CATALOG = K.CONSTRAINT_CATALOG
                                                         AND C.CONSTRAINT_SCHEMA = K.CONSTRAINT_SCHEMA
                                                         AND C.CONSTRAINT_NAME = K.CONSTRAINT_NAME
WHERE   C.CONSTRAINT_TYPE = 'PRIMARY KEY'
        AND K.COLUMN_NAME = 'keycol';

【讨论】:

您还应该在 where 子句中包含感兴趣的表名。否则,如果其他表的主键与您感兴趣的表的主键具有相同的列名,您将得到该结果。【参考方案2】:

同样,以下内容将为您提供有关所有表及其键的信息,而不是有关特定列的信息。这样,您可以确保您拥有所有感兴趣的列并知道它们参与的内容。要查看所有键(主键、外键、唯一键),请注释 WHERE 子句。

SELECT K.TABLE_NAME, C.CONSTRAINT_TYPE, K.COLUMN_NAME, K.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS C
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS K
ON C.TABLE_NAME = K.TABLE_NAME
AND C.CONSTRAINT_CATALOG = K.CONSTRAINT_CATALOG
AND C.CONSTRAINT_SCHEMA = K.CONSTRAINT_SCHEMA
AND C.CONSTRAINT_NAME = K.CONSTRAINT_NAME
WHERE C.CONSTRAINT_TYPE = 'PRIMARY KEY'
ORDER BY K.TABLE_NAME, C.CONSTRAINT_TYPE, K.CONSTRAINT_NAME

【讨论】:

【参考方案3】:

根据您的需要,使用 INFORMATION_SCHEMA.COLUMNS 和 INFORMATION_SCHEMA.KEY_COLUMN_USAGE 进行完全外部联接。在 select 语句中,从 INFORMATION_SCHEMA.KEY_COLUMN_USAGE 添加 CONSTRAINT_NAME 列,这将为您提供 null 或键名。

select C.Table_Name, C.Column_name, data_type, is_Nullable, U.CONSTRAINT_NAME
from information_Schema.Columns C FULL OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE U ON C.COLUMN_NAME = U.COLUMN_NAME
WHERE C.TABLE_NAME=@TABLENAME

【讨论】:

很好的答案,但您也应该在 WHERE 子句中添加 TABLE_NAME 以确保我们从正确的表中提取 PK,否则它将加载所有表的 PK,而在完整外部期间,多个表的 PK 字段名称相同加入。【参考方案4】:

这个查询返回的列是主键。

SELECT  col.COLUMN_NAME ,
        col.DATA_TYPE ,
        col.CHARACTER_MAXIMUM_LENGTH ln ,
        CAST(ISNULL(j.is_primary, 0) AS BIT) is_primary
FROM    INFORMATION_SCHEMA.COLUMNS col
        LEFT JOIN ( SELECT  K.TABLE_NAME ,
                            K.COLUMN_NAME ,
                            CASE WHEN K.CONSTRAINT_NAME IS NULL THEN 0
                                 WHEN K.CONSTRAINT_NAME IS NOT NULL THEN 1
                            END is_primary
                    FROM    INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS C
                            JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS K ON C.TABLE_NAME = K.TABLE_NAME
                                                              AND C.CONSTRAINT_CATALOG = K.CONSTRAINT_CATALOG
                                                              AND C.CONSTRAINT_SCHEMA = K.CONSTRAINT_SCHEMA
                                                              AND C.CONSTRAINT_NAME = K.CONSTRAINT_NAME
                    WHERE   C.CONSTRAINT_TYPE = 'PRIMARY KEY'
                            AND C.TABLE_NAME = 'tablename'
                  ) j ON col.COLUMN_NAME = j.COLUMN_NAME
WHERE   col.TABLE_NAME = 'tablename'

【讨论】:

以上是关于如何确定列是不是在其表的主键中? (SQL 服务器)的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver字段如何自动更新

SQL中的ON DUPLICATE KEY UPDATE使用详解

在SQL SERVER 中对表不能设置主键

从列而不是主键中选择最大值的正确方法是啥

如何在数据库C#中查找表的主键

MS SQL SERVER搜索某个表的主键所在的列名