【问题标题】:How do you list the primary key of a SQL Server table?如何列出 SQL Server 表的主键?
【发布时间】:2010-09-10 21:24:00
【问题描述】:

简单的问题,如何用T-SQL列出表的主键?我知道如何获取表的索引,但不记得如何获取 PK。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    系统存储过程sp_help 将为您提供信息。执行以下语句:

    execute sp_help table_name
    

    【讨论】:

      【解决方案2】:
      SELECT Col.Column_Name from 
          INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab, 
          INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col 
      WHERE 
          Col.Constraint_Name = Tab.Constraint_Name
          AND Col.Table_Name = Tab.Table_Name
          AND Constraint_Type = 'PRIMARY KEY'
          AND Col.Table_Name = '<your table name>'
      

      【讨论】:

      • 仅供参考-这不一定会按顺序列出列。如果您需要按特定顺序排列的列,请参阅类似问题的答案:stackoverflow.com/a/3942921/18511
      • 其实我相信你也得受Schema约束吧?因此,您还需要添加“And COL.TABLE_SCHEMA = ''”。
      • 如果上述查询返回 3 行,abc,(按此顺序)那么我的表有一个主复合键 abc?
      【解决方案3】:

      在使用 MS SQL Server 时,您可以执行以下操作:

      --List all tables primary keys
      select * from information_schema.table_constraints
      where constraint_type = 'Primary Key'
      

      如果你想要一个特定的表,你也可以过滤 table_name 列。

      【讨论】:

      • 这里只列出key,不列出key中的列
      • 这是一个正确的开始,但需要加入 INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE,就像 Guy Starbuck 的回答一样。
      【解决方案4】:

      试试这个:

      SELECT
          CONSTRAINT_CATALOG AS DataBaseName,
          CONSTRAINT_SCHEMA AS SchemaName,
          TABLE_NAME AS TableName,
          CONSTRAINT_Name AS PrimaryKey
      FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
      WHERE CONSTRAINT_TYPE = 'Primary Key' and Table_Name = 'YourTable'
      

      【讨论】:

        【解决方案5】:
        SELECT t.name AS 'table', i.name AS 'index', it.xtype,
        
        (SELECT c.name FROM syscolumns c INNER JOIN sysindexkeys k 
            ON k.indid = i.indid 
                AND c.colid = k.colid 
                AND c.id = t.id 
                AND k.keyno = 1 
                AND k.id = t.id)
            AS 'column1',
        
        (SELECT c.name FROM syscolumns c INNER JOIN sysindexkeys k 
            ON k.indid = i.indid 
                AND c.colid = k.colid 
                AND c.id = t.id 
                AND k.keyno = 2 
                AND k.id = t.id)
            AS 'column2',
        
        (SELECT c.name FROM syscolumns c INNER JOIN sysindexkeys k 
            ON k.indid = i.indid 
                AND c.colid = k.colid 
                AND c.id = t.id 
                AND k.keyno = 3
                AND k.id = t.id)
            AS 'column3',
        
        (SELECT c.name FROM syscolumns c INNER JOIN sysindexkeys k 
            ON k.indid = i.indid 
                AND c.colid = k.colid 
                AND c.id = t.id 
                AND k.keyno = 4
                AND k.id = t.id)
            AS 'column4',
        
        (SELECT c.name FROM syscolumns c INNER JOIN sysindexkeys k 
            ON k.indid = i.indid 
                AND c.colid = k.colid 
                AND c.id = t.id 
                AND k.keyno = 5
                AND k.id = t.id)
            AS 'column5',
        
        (SELECT c.name FROM syscolumns c INNER JOIN sysindexkeys k 
            ON k.indid = i.indid 
                AND c.colid = k.colid 
                AND c.id = t.id 
                AND k.keyno = 6
                AND k.id = t.id)
            AS 'column6',
        
        (SELECT c.name FROM syscolumns c INNER JOIN sysindexkeys k 
            ON k.indid = i.indid 
                AND c.colid = k.colid 
                AND c.id = t.id 
                AND k.keyno = 7
                AND k.id = t.id)
            AS 'column7',
        
        (SELECT c.name FROM syscolumns c INNER JOIN sysindexkeys k 
            ON k.indid = i.indid 
                AND c.colid = k.colid 
                AND c.id = t.id 
                AND k.keyno = 8 
                AND k.id = t.id)
            AS 'column8',
        
        (SELECT c.name FROM syscolumns c INNER JOIN sysindexkeys k 
            ON k.indid = i.indid 
                AND c.colid = k.colid 
                AND c.id = t.id 
                AND k.keyno = 9 
                AND k.id = t.id)
            AS 'column9',
        
        (SELECT c.name FROM syscolumns c INNER JOIN sysindexkeys k 
            ON k.indid = i.indid 
                AND c.colid = k.colid 
                AND c.id = t.id 
                AND k.keyno = 10
                AND k.id = t.id)
            AS 'column10',
        
        FROM sysobjects t
            INNER JOIN sysindexes i ON i.id = t.id 
            INNER JOIN sysobjects it ON it.parent_obj = t.id AND it.name = i.name
        
        WHERE it.xtype = 'PK'
        ORDER BY t.name, i.name
        

        【讨论】:

        • 由于某种原因,我在返回多个值的子查询中遇到错误。我尝试注释掉每个子查询以查看是否可以指出它,但它们似乎都在同一张表上失败,该表的索引中只有一个字段。任何想法为什么会发生这种情况?
        • 我发现问题出在列出表函数的时候。不知道为什么,但是列(即 column1)的字段计数为 2。我的解决方法是将最后的 WHERE 子句更改为“WHERE it.xtype='PK' AND t.[type] ='U'”。
        • 我还在每列选择上使用 isnull 函数对其进行了美化,以避免在我的结果集中看到“NULL”。例如: ,ISNULL( (SELECT c.name FROM syscolumns c INNER JOIN sysindexkeys k ON k.indid = i.indid AND c.colid = k.colid AND c.id = t.id AND k.keyno = 1 AND k .id = t.id), '' ) AS 'column1'
        【解决方案6】:

        我喜欢 INFORMATION_SCHEMA 技术,但我使用的另一种技术是: exec sp_pkeys '表'

        【讨论】:

          【解决方案7】:

          谢谢你。

          我用它来查找所有表的所有主键。

          SELECT A.Name,Col.Column_Name from 
              INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab, 
              INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col ,
              (select NAME from dbo.sysobjects where xtype='u') AS A
          WHERE 
              Col.Constraint_Name = Tab.Constraint_Name
              AND Col.Table_Name = Tab.Table_Name
              AND Constraint_Type = 'PRIMARY KEY '
              AND Col.Table_Name = A.Name
          

          【讨论】:

            【解决方案8】:
            SELECT A.TABLE_NAME as [Table_name], A.CONSTRAINT_NAME as [Primary_Key]
             FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS A, INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE B
             WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
            

            【讨论】:

              【解决方案9】:

              --这是另一个修改版本,也是关联查询的一个例子

              SELECT TC.TABLE_NAME as [Table_name], TC.CONSTRAINT_NAME as [Primary_Key]
               FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC
               INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU
               ON TC.CONSTRAINT_NAME = CCU.CONSTRAINT_NAME
               WHERE TC.CONSTRAINT_TYPE = 'PRIMARY KEY' AND
               TC.TABLE_NAME IN
               (SELECT [NAME] AS [TABLE_NAME] FROM SYS.OBJECTS 
               WHERE TYPE = 'U')
              

              【讨论】:

                【解决方案10】:

                这应该列出所有约束(主键和外键)并在查询末尾放置表名

                /* CAST IS DONE , SO THAT OUTPUT INTEXT FILE REMAINS WITH SCREEN LIMIT*/
                WITH   ALL_KEYS_IN_TABLE (CONSTRAINT_NAME,CONSTRAINT_TYPE,PARENT_TABLE_NAME,PARENT_COL_NAME,PARENT_COL_NAME_DATA_TYPE,REFERENCE_TABLE_NAME,REFERENCE_COL_NAME) 
                AS
                (
                SELECT  CONSTRAINT_NAME= CAST (PKnUKEY.name AS VARCHAR(30)) ,
                        CONSTRAINT_TYPE=CAST (PKnUKEY.type_desc AS VARCHAR(30)) ,
                        PARENT_TABLE_NAME=CAST (PKnUTable.name AS VARCHAR(30)) ,
                        PARENT_COL_NAME=CAST ( PKnUKEYCol.name AS VARCHAR(30)) ,
                        PARENT_COL_NAME_DATA_TYPE=  oParentColDtl.DATA_TYPE,        
                        REFERENCE_TABLE_NAME='' ,
                        REFERENCE_COL_NAME='' 
                
                FROM sys.key_constraints as PKnUKEY
                    INNER JOIN sys.tables as PKnUTable
                            ON PKnUTable.object_id = PKnUKEY.parent_object_id
                    INNER JOIN sys.index_columns as PKnUColIdx
                            ON PKnUColIdx.object_id = PKnUTable.object_id
                            AND PKnUColIdx.index_id = PKnUKEY.unique_index_id
                    INNER JOIN sys.columns as PKnUKEYCol
                            ON PKnUKEYCol.object_id = PKnUTable.object_id
                            AND PKnUKEYCol.column_id = PKnUColIdx.column_id
                     INNER JOIN INFORMATION_SCHEMA.COLUMNS oParentColDtl
                            ON oParentColDtl.TABLE_NAME=PKnUTable.name
                            AND oParentColDtl.COLUMN_NAME=PKnUKEYCol.name
                UNION ALL
                SELECT  CONSTRAINT_NAME= CAST (oConstraint.name AS VARCHAR(30)) ,
                        CONSTRAINT_TYPE='FK',
                        PARENT_TABLE_NAME=CAST (oParent.name AS VARCHAR(30)) ,
                        PARENT_COL_NAME=CAST ( oParentCol.name AS VARCHAR(30)) ,
                        PARENT_COL_NAME_DATA_TYPE= oParentColDtl.DATA_TYPE,     
                        REFERENCE_TABLE_NAME=CAST ( oReference.name AS VARCHAR(30)) ,
                        REFERENCE_COL_NAME=CAST (oReferenceCol.name AS VARCHAR(30)) 
                FROM sys.foreign_key_columns FKC
                    INNER JOIN sys.sysobjects oConstraint
                            ON FKC.constraint_object_id=oConstraint.id 
                    INNER JOIN sys.sysobjects oParent
                            ON FKC.parent_object_id=oParent.id
                    INNER JOIN sys.all_columns oParentCol
                            ON FKC.parent_object_id=oParentCol.object_id /* ID of the object to which this column belongs.*/
                            AND FKC.parent_column_id=oParentCol.column_id/* ID of the column. Is unique within the object.Column IDs might not be sequential.*/
                    INNER JOIN sys.sysobjects oReference
                            ON FKC.referenced_object_id=oReference.id
                    INNER JOIN INFORMATION_SCHEMA.COLUMNS oParentColDtl
                            ON oParentColDtl.TABLE_NAME=oParent.name
                            AND oParentColDtl.COLUMN_NAME=oParentCol.name
                    INNER JOIN sys.all_columns oReferenceCol
                            ON FKC.referenced_object_id=oReferenceCol.object_id /* ID of the object to which this column belongs.*/
                            AND FKC.referenced_column_id=oReferenceCol.column_id/* ID of the column. Is unique within the object.Column IDs might not be sequential.*/
                
                )
                
                select * from   ALL_KEYS_IN_TABLE
                where   
                    PARENT_TABLE_NAME  in ('YOUR_TABLE_NAME') 
                    or REFERENCE_TABLE_NAME  in ('YOUR_TABLE_NAME')
                ORDER BY PARENT_TABLE_NAME,CONSTRAINT_NAME;
                

                供参考,请阅读-http://blogs.msdn.com/b/sqltips/archive/2005/09/16/469136.aspx

                【讨论】:

                  【解决方案11】:

                  这是问题get table primary key using sql query的另一种方式:

                  SELECT COLUMN_NAME
                  FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
                  WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA+'.'+CONSTRAINT_NAME), 'IsPrimaryKey') = 1
                    AND TABLE_NAME = '<your table name>'
                  

                  它使用KEY_COLUMN_USAGE 来确定给定表的约束
                  然后使用OBJECTPROPERTY(<i>id</i>, 'IsPrimaryKey')判断每个是否为主键

                  【讨论】:

                    【解决方案12】:

                    我发现这很有用,给出了一个表列表,其中包含一个逗号分隔的列列表,然后还有一个逗号分隔的主键列表

                    SELECT T.TABLE_SCHEMA, T.TABLE_NAME, 
                    STUFF((
                        SELECT ', ' + C.COLUMN_NAME
                        FROM INFORMATION_SCHEMA.COLUMNS C
                            WHERE C.TABLE_SCHEMA = T.TABLE_SCHEMA
                            AND T.TABLE_NAME = C.TABLE_NAME
                            FOR XML PATH ('')
                        ), 1, 2, '') AS Columns,
                    STUFF((
                    SELECT ', ' + C.COLUMN_NAME 
                    FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE C
                    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC
                        ON C.TABLE_SCHEMA = TC.TABLE_SCHEMA
                        AND C.TABLE_NAME = TC.TABLE_NAME
                        WHERE C.TABLE_SCHEMA = T.TABLE_SCHEMA
                        AND T.TABLE_NAME = C.TABLE_NAME
                        AND TC.CONSTRAINT_TYPE = 'PRIMARY KEY'
                        FOR XML PATH ('')
                    ), 1, 2, '') AS [Key]
                    FROM INFORMATION_SCHEMA.TABLES T
                    ORDER BY T.TABLE_SCHEMA, T.TABLE_NAME
                    

                    【讨论】:

                    • 类似这样的东西 (?) : Select distinct SUBSTRING ( stuff(( select distinct ',' + [COLUMN_NAME] from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + QUOTENAME(CONSTRAINT_NAME) ), 'IsPrimaryKey') = 1 AND TABLE_NAME = 'TableName' AND TABLE_SCHEMA = 'Schema' order by 1 FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1, 0,'' ) ,2,9999)
                    【解决方案13】:

                    这个为你提供了 PK 的列。

                    SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'TableName'
                    

                    【讨论】:

                      【解决方案14】:

                      现在通常建议在 SQL Server 中使用 sys.* 视图而不是 INFORMATION_SCHEMA,因此除非您计划迁移数据库,否则我会使用这些视图。以下是使用 sys.* 视图的方法:

                      SELECT 
                          c.name AS column_name,
                          i.name AS index_name,
                          c.is_identity
                      FROM sys.indexes i
                          inner join sys.index_columns ic  ON i.object_id = ic.object_id AND i.index_id = ic.index_id
                          inner 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.object_ID = OBJECT_ID('<schema>.<tablename>');
                      

                      【讨论】:

                      • 要订购,请在查询中添加“ORDER BY ic.key_ordinal ASC”
                      【解决方案15】:

                      这是一个仅使用 sys-tables 的解决方案。

                      它列出了数据库中的所有主键。它为每个主键返回架构、表名、列名和正确的列排序顺序

                      如果要获取特定表的主键,则需要对 SchemaNameTableName 进行过滤。

                      恕我直言,这个解决方案非常通用,不使用任何字符串文字,因此它可以在任何机器上运行。

                      select 
                          s.name as SchemaName,
                          t.name as TableName,
                          tc.name as ColumnName,
                          ic.key_ordinal as KeyOrderNr
                      from 
                          sys.schemas s 
                          inner join sys.tables t   on s.schema_id=t.schema_id
                          inner join sys.indexes i  on t.object_id=i.object_id
                          inner join sys.index_columns ic on i.object_id=ic.object_id 
                                                         and i.index_id=ic.index_id
                          inner join sys.columns tc on ic.object_id=tc.object_id 
                                                   and ic.column_id=tc.column_id
                      where i.is_primary_key=1 
                      order by t.name, ic.key_ordinal ;
                      

                      【讨论】:

                        【解决方案16】:

                        以下查询将列出特定表主键

                        SELECT DISTINCT
                            CONSTRAINT_NAME AS [Constraint],
                            TABLE_SCHEMA AS [Schema],
                            TABLE_NAME AS TableName
                        FROM
                            INFORMATION_SCHEMA.KEY_COLUMN_USAGE
                        WHERE
                            TABLE_NAME = 'mytablename'
                        

                        【讨论】:

                          【解决方案17】:

                          此版本显示架构、表名和有序的、以逗号分隔的主键列表。 Object_Id() 不适用于链接服务器,因此我们按表名过滤。

                          如果没有 REPLACE(Si1.Column_Name, '', ''),它将在我正在测试的数据库上显示 Column_Name 的 xml 开始和结束标记。我不确定为什么数据库需要替换“Column_Name”,所以如果有人知道,请发表评论。

                          DECLARE @TableName VARCHAR(100) = '';
                          WITH Sysinfo
                              AS (SELECT Kcu.Table_Name
                                      , Kcu.Table_Schema AS Schema_Name
                                      , Kcu.Column_Name
                                      , Kcu.Ordinal_Position
                                  FROM   [LinkServer].Information_Schema.Key_Column_Usage Kcu
                                       JOIN [LinkServer].Information_Schema.Table_Constraints AS Tc ON Tc.Constraint_Name = Kcu.Constraint_Name
                                  WHERE  Tc.Constraint_Type = 'Primary Key')
                              SELECT           Schema_Name
                                              ,Table_Name
                                              , STUFF(
                                                    (
                                                       SELECT ', '
                                                           , REPLACE(Si1.Column_Name, '', '')
                                                       FROM    Sysinfo Si1
                                                       WHERE  Si1.Table_Name = Si2.Table_Name
                                                       ORDER BY Si1.Table_Name
                                                             , Si1.Ordinal_Position
                                                       FOR XML PATH('')
                                                    ), 1, 2, '') AS Primary_Keys
                              FROM Sysinfo Si2
                              WHERE Table_Name = CASE
                                                 WHEN @TableName NOT IN( '', 'All')
                                                 THEN @TableName
                                                 ELSE Table_Name
                                              END
                              GROUP BY Si2.Table_Name, Si2.Schema_Name;
                          

                          同样的模式使用 George 的查询:

                          DECLARE @TableName VARCHAR(100) = '';
                          WITH Sysinfo
                              AS (SELECT S.Name AS Schema_Name
                                      , T.Name AS Table_Name
                                      , Tc.Name AS Column_Name
                                      , Ic.Key_Ordinal AS Ordinal_Position
                                  FROM   [LinkServer].Sys.Schemas S
                                       JOIN [LinkServer].Sys.Tables T ON S.Schema_Id = T.Schema_Id
                                       JOIN [LinkServer].Sys.Indexes I ON T.Object_Id = I.Object_Id
                                       JOIN [LinkServer].Sys.Index_Columns Ic ON I.Object_Id = Ic.Object_Id
                                                                                 AND I.Index_Id = Ic.Index_Id
                                       JOIN [LinkServer].Sys.Columns Tc ON Ic.Object_Id = Tc.Object_Id
                                                                            AND Ic.Column_Id = Tc.Column_Id
                                  WHERE  I.Is_Primary_Key = 1)
                              SELECT           Schema_Name
                                              ,Table_Name
                                              , STUFF(
                                                    (
                                                       SELECT ', '
                                                           , REPLACE(Si1.Column_Name, '', '')
                                                       FROM    Sysinfo Si1
                                                       WHERE  Si1.Table_Name = Si2.Table_Name
                                                       ORDER BY Si1.Table_Name
                                                             , Si1.Ordinal_Position
                                                       FOR XML PATH('')
                                                    ), 1, 2, '') AS Primary_Keys
                              FROM Sysinfo Si2
                              WHERE Table_Name = CASE
                                                 WHEN @TableName NOT IN('', 'All')
                                                 THEN @TableName
                                                 ELSE Table_Name
                                              END
                              GROUP BY Si2.Table_Name, Si2.Schema_Name;
                          

                          【讨论】:

                            【解决方案18】:

                            Sys.Objects 表包含每个用户定义的模式范围的行 对象。

                            像 Primary Key 或其他创建的约束将是 object 和 表名将是 parent_object

                            查询 sys.Objects 并收集 Object 的所需类型的 Id

                            declare @TableName nvarchar(50)='TblInvoice' -- your table name
                            declare @TypeOfKey nvarchar(50)='PK' -- For Primary key
                            
                            SELECT Name FROM sys.objects
                            WHERE type = @TypeOfKey 
                            AND  parent_object_id = OBJECT_ID (@TableName)
                            

                            【讨论】:

                              【解决方案19】:

                              我正在讲述一个我遵循的简单技术

                              SP_HELP 'table_name'
                              

                              将此代码作为查询运行。在您想知道主键的 table_name 位置提及您的表名(不要忘记单引号)。结果将显示为附加图像。希望对你有帮助

                              【讨论】:

                              • 确保你的表名用单引号括起来,否则命令将不起作用!
                              【解决方案20】:

                              我可以对下面的原始问题提出一个更准确的简单答案

                              SELECT 
                              KEYS.table_schema, KEYS.table_name, KEYS.column_name, KEYS.ORDINAL_POSITION 
                              FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE keys
                              INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS CONS 
                                  ON cons.TABLE_SCHEMA = keys.TABLE_SCHEMA 
                                  AND cons.TABLE_NAME = keys.TABLE_NAME 
                                  AND cons.CONSTRAINT_NAME = keys.CONSTRAINT_NAME
                              WHERE cons.CONSTRAINT_TYPE = 'PRIMARY KEY'
                              

                              注意事项:

                              1. 上面的一些答案缺少仅用于主键的过滤器 列!
                              2. 我在 CTE 中使用 below 来加入更大的列 列表以提供来自源的元数据,以提供 BIML 生成的临时表和 SSIS 代码

                              【讨论】:

                                【解决方案21】:

                                最近可能会发布,但希望这将帮助某人通过使用此 t-sql 查询来查看 sql server 中的主键列表:

                                SELECT  schema_name(t.schema_id) AS [schema_name], t.name AS TableName,        
                                    COL_NAME(ic.OBJECT_ID,ic.column_id) AS PrimaryKeyColumnName,
                                    i.name AS PrimaryKeyConstraintName
                                FROM    sys.tables t 
                                INNER JOIN sys.indexes AS i  on t.object_id=i.object_id 
                                INNER JOIN  sys.index_columns AS ic ON  i.OBJECT_ID = ic.OBJECT_ID
                                                            AND i.index_id = ic.index_id 
                                WHERE OBJECT_NAME(ic.OBJECT_ID) = 'YourTableNameHere'
                                

                                如果您愿意,可以使用此查询查看所有外键的列表:

                                SELECT
                                f.name as ForeignKeyConstraintName
                                ,OBJECT_NAME(f.parent_object_id) AS ReferencingTableName
                                ,COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ReferencingColumnName
                                ,OBJECT_NAME (f.referenced_object_id) AS ReferencedTableName
                                ,COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS 
                                 ReferencedColumnName  ,delete_referential_action_desc AS 
                                DeleteReferentialActionDesc ,update_referential_action_desc AS 
                                UpdateReferentialActionDesc
                                FROM sys.foreign_keys AS f
                                INNER JOIN sys.foreign_key_columns AS fc
                                ON f.object_id = fc.constraint_object_id
                                 --WHERE OBJECT_NAME(f.parent_object_id) = 'YourTableNameHere' 
                                 --If you want to know referecing table details 
                                 WHERE OBJECT_NAME(f.referenced_object_id) = 'YourTableNameHere' 
                                 --If you want to know refereced table details 
                                ORDER BY f.name
                                

                                【讨论】:

                                  【解决方案22】:

                                  我从我的朋友那里找到了这个,如果您正在查找特定架构下的所有表的主键,这非常有效。

                                  SELECT tc.constraint_name AS IndexName,tc.table_name AS TableName,tc.table_schema
                                  AS SchemaName,kc.column_name AS COLUMN_NAME
                                  FROM information_schema.table_constraints tc,information_schema.key_column_usage kc
                                  WHERE tc.constraint_type = 'PRIMARY KEY' AND kc.table_name = tc.table_name AND kc.table_schema = tc.table_schema
                                  AND kc.constraint_name = tc.constraint_name AND tc.table_schema='<SCHEMA_NAME>'
                                  

                                  【讨论】:

                                    【解决方案23】:

                                    如果您正在寻找自己的 ORM 或从给定表生成代码,那么这可能就是您正在寻找的形式:

                                    declare @table varchar(100) = 'mytable';
                                    
                                    with cte as
                                    (
                                        select 
                                            tc.CONSTRAINT_SCHEMA
                                            , tc.CONSTRAINT_TYPE
                                            , tc.TABLE_NAME
                                            , ccu.COLUMN_NAME
                                            , IS_NULLABLE
                                            , DATA_TYPE
                                            , CHARACTER_MAXIMUM_LENGTH
                                            , NUMERIC_PRECISION
                                        from 
                                            INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
                                            inner join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu on tc.TABLE_NAME=ccu.TABLE_NAME  and tc.TABLE_SCHEMA=ccu.TABLE_SCHEMA
                                            inner join information_schema.COLUMNS c on ccu.COLUMN_NAME=c.COLUMN_NAME and ccu.TABLE_NAME=c.TABLE_NAME and ccu.TABLE_SCHEMA=c.TABLE_SCHEMA
                                        where 
                                            tc.table_name=@table
                                            and 
                                            ccu.CONSTRAINT_NAME=tc.CONSTRAINT_NAME
                                        union 
                                        select TABLE_SCHEMA,'COLUMN', TABLE_NAME, COLUMN_NAME, IS_NULLABLE, DATA_TYPE,CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME=@table
                                        and COLUMN_NAME not in (select COLUMN_NAME from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE where TABLE_NAME = @table)
                                    )
                                    select 
                                        cast(iif(CONSTRAINT_TYPE='PRIMARY KEY',1,0) as bit) PrimaryKey
                                        ,cast(iif(CONSTRAINT_TYPE='FOREIGN KEY',1,0) as bit) ForeignKey
                                        ,cast(iif(CONSTRAINT_TYPE='COLUMN',1,0) as bit) NotKey
                                        ,COLUMN_NAME
                                        ,cast(iif(is_nullable='NO',0,1) as bit) IsNullable
                                        , DATA_TYPE
                                        , CHARACTER_MAXIMUM_LENGTH
                                        , NUMERIC_PRECISION 
                                    from 
                                        cte 
                                    order by 
                                        case CONSTRAINT_TYPE 
                                            when 'PRIMARY KEY' then 1 
                                            when 'FOREIGN KEY' then 2 
                                            else 3 end
                                        , COLUMN_NAME
                                    

                                    结果如下:

                                    				<table cellspacing=0 border=1>
                                    					<tr>
                                    						<td style=min-width:50px>PrimaryKey</td>
                                    						<td style=min-width:50px>ForeignKey</td>
                                    						<td style=min-width:50px>NotKey</td>
                                    						<td style=min-width:50px>COLUMN_NAME</td>
                                    						<td style=min-width:50px>IsNullable</td>
                                    						<td style=min-width:50px>DATA_TYPE</td>
                                    						<td style=min-width:50px>CHARACTER_MAXIMUM_LENGTH</td>
                                    						<td style=min-width:50px>NUMERIC_PRECISION</td>
                                    					</tr>
                                    					<tr>
                                    						<td style=min-width:50px>1</td>
                                    						<td style=min-width:50px>0</td>
                                    						<td style=min-width:50px>0</td>
                                    						<td style=min-width:50px>LectureNoteID</td>
                                    						<td style=min-width:50px>0</td>
                                    						<td style=min-width:50px>int</td>
                                    						<td style=min-width:50px>NULL</td>
                                    						<td style=min-width:50px>10</td>
                                    					</tr>
                                    					<tr>
                                    						<td style=min-width:50px>0</td>
                                    						<td style=min-width:50px>1</td>
                                    						<td style=min-width:50px>0</td>
                                    						<td style=min-width:50px>LectureId</td>
                                    						<td style=min-width:50px>0</td>
                                    						<td style=min-width:50px>int</td>
                                    						<td style=min-width:50px>NULL</td>
                                    						<td style=min-width:50px>10</td>
                                    					</tr>
                                    					<tr>
                                    						<td style=min-width:50px>0</td>
                                    						<td style=min-width:50px>1</td>
                                    						<td style=min-width:50px>0</td>
                                    						<td style=min-width:50px>NoteTypeID</td>
                                    						<td style=min-width:50px>0</td>
                                    						<td style=min-width:50px>int</td>
                                    						<td style=min-width:50px>NULL</td>
                                    						<td style=min-width:50px>10</td>
                                    					</tr>
                                    					<tr>
                                    						<td style=min-width:50px>0</td>
                                    						<td style=min-width:50px>0</td>
                                    						<td style=min-width:50px>1</td>
                                    						<td style=min-width:50px>Body</td>
                                    						<td style=min-width:50px>0</td>
                                    						<td style=min-width:50px>nvarchar</td>
                                    						<td style=min-width:50px>-1</td>
                                    						<td style=min-width:50px>NULL</td>
                                    					</tr>
                                    					<tr>
                                    						<td style=min-width:50px>0</td>
                                    						<td style=min-width:50px>0</td>
                                    						<td style=min-width:50px>1</td>
                                    						<td style=min-width:50px>DisplayOrder</td>
                                    						<td style=min-width:50px>0</td>
                                    						<td style=min-width:50px>int</td>
                                    						<td style=min-width:50px>NULL</td>
                                    						<td style=min-width:50px>10</td>
                                    					</tr>
                                    				</table>
                                    				

                                    【讨论】:

                                      【解决方案24】:

                                      如果需要主键和类型,此查询可能有用:

                                      SELECT L.TABLE_SCHEMA, L.TABLE_NAME, L.COLUMN_NAME, R.TypeName
                                      FROM(
                                          SELECT COLUMN_NAME, TABLE_NAME, TABLE_SCHEMA
                                          FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
                                          WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + QUOTENAME(CONSTRAINT_NAME)), 'IsPrimaryKey') = 1
                                      )L
                                      LEFT JOIN (
                                          SELECT
                                          OBJECT_NAME(c.OBJECT_ID) TableName ,c.name AS ColumnName ,t.name AS TypeName
                                          FROM sys.columns AS c
                                          JOIN sys.types AS t ON c.user_type_id=t.user_type_id
                                      )R ON L.COLUMN_NAME = R.ColumnName AND L.TABLE_NAME = R.TableName
                                      

                                      【讨论】:

                                        【解决方案25】:

                                        对于给定 TableName 和 Schema 的主键列的逗号分隔列表:

                                        Select distinct SUBSTRING ( stuff(( select distinct ',' + [COLUMN_NAME] 
                                                                            from INFORMATION_SCHEMA.KEY_COLUMN_USAGE  
                                                                            where OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + QUOTENAME(CONSTRAINT_NAME)), 'IsPrimaryKey') = 1  
                                                                            AND TABLE_NAME = 'TableName' AND TABLE_SCHEMA = 'Schema'  
                                                                            order by 1 FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,0,'' ) 
                                                                    ,2,9999) 
                                        

                                        【讨论】:

                                          【解决方案26】:

                                          可能是最简单的解决方案:)

                                          EXEC sp_pkeys YourTable

                                          【讨论】:

                                            【解决方案27】:

                                            如果您在 Oracle 中需要它,那就太简单了。

                                            SELECT `Constraint_Name`
                                              FROM `All_Constraints`
                                             WHERE `Constraint_Type` = `'P'`
                                               AND `Owner` = `'your schema here';`
                                            

                                            【讨论】:

                                              猜你喜欢
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 2018-07-11
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 1970-01-01
                                              相关资源
                                              最近更新 更多