【问题标题】:Determine a table's primary key using TSQL使用 TSQL 确定表的主键
【发布时间】:2010-12-04 06:48:55
【问题描述】:

我想使用 TSQL 确定表的主键(存储过程或系统表都可以)。 SQL Server(2005或2008)有这种机制吗?

【问题讨论】:

    标签: sql sql-server tsql primary-key


    【解决方案1】:

    这应该让你开始:

    SELECT 
        *
    FROM 
        INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
        JOIN 
        INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu 
            ON tc.CONSTRAINT_NAME = ccu.Constraint_name
    WHERE 
        tc.TABLE_NAME = 'TableName' AND 
        tc.CONSTRAINT_TYPE = 'Primary Key'
    

    【讨论】:

    • ON tc.CONSTRAINT_NAME = ccu.CONSTRAINT_NAME AND tc.CONSTRAINT_SCHEMA = ccu.CONSTRAINT_SCHEMA 用于多个模式
    【解决方案2】:

    怎么样

    sp_pkeys 'TableName'
    

    【讨论】:

    • 恒星!与通过 information_schema 进行表连接相比,我看到的性能要好得多
    • 如果它是一个可以从中选择的表值函数会更方便
    • 不能对结果做任何事情,因为它不是一个函数。
    • 如果需要表,可以将存储过程的结果插入到表中。先定义表declare @PrimaryKey table (TABLE_QUALIFIER nvarchar(100), TABLE_OWNER nvarchar(100), TABLE_NAME nvarchar(100), COLUMN_NAME nvarchar(100), KEY_SEQ int, PK_NAME nvarchar(100))再定义insert into @PrimaryKey exec sp_pkeys 'TABLE_NAME'
    【解决方案3】:

    这是基于 SQL 2005 的系统表的一个(99% 肯定它会在 2008 年工作)。这将列出所有用户定义表的所有 PK,以及所有列和一些可以删除的额外绒毛。添加参数以一次选择一张表。

    SELECT
       schema_name(ta.schema_id)  SchemaName
      ,ta.name  TableName
      ,ind.name
      ,indcol.key_ordinal Ord
      ,col.name  ColumnName
      ,ind.type_desc
      ,ind.fill_factor
     from sys.tables ta
      inner join sys.indexes ind
       on ind.object_id = ta.object_id
      inner join sys.index_columns indcol
       on indcol.object_id = ta.object_id
        and indcol.index_id = ind.index_id
      inner join sys.columns col
       on col.object_id = ta.object_id
        and col.column_id = indcol.column_id
     where ind.is_primary_key = 1
     order by
       ta.name
      ,indcol.key_ordinal
    

    【讨论】:

      【解决方案4】:
      SELECT ccu.COLUMN_NAME, ccu.CONSTRAINT_NAME
      FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc
          INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS ccu
              ON tc.CONSTRAINT_NAME = ccu.CONSTRAINT_NAME
      WHERE tc.TABLE_CATALOG = 'Your_Catalog'    -- replace with your catalog
          AND tc.TABLE_SCHEMA = 'dbo'            -- replace with your schema
          AND tc.TABLE_NAME = 'Your_Table'       -- replace with your table name
          AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
      

      【讨论】:

      • 这比接受的答案方式好,因为它提供了表名。
      • 它也更好,因为它在列和 PRIMARY KEY 上具有正确的大小写,因此它可以在区分大小写的服务器上工作!
      【解决方案5】:
      exec [sys].[sp_primary_keys_rowset] @table_name= 'TableName'
      

      【讨论】:

        【解决方案6】:
        EXEC sp_Pkeys @tableName
        

        【讨论】:

          【解决方案7】:

          您最好使用INFORMATION_SCHEMA.KEY_COLUMN_USAGE,因为您可以访问重要的订购信息 (ORDINAL_POSITION)。

          SELECT 
              kcu.*
          FROM 
              INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
              INNER JOIN 
              INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
                  ON  tc.TABLE_NAME = kcu.TABLE_NAME AND 
                      tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
          ORDER BY 
              tc.TABLE_NAME,
              tc.CONSTRAINT_NAME,
              kcu.ORDINAL_POSITION
          

          【讨论】:

            【解决方案8】:

            最简单的方法就是这个!

            select object_id from sys.objects 
            where parent_object_id = OBJECT_ID(N'FACounty')
            and [type] = N'PK'
            

            【讨论】:

            • 此代码不返回包含主键的列,请尝试使用复合主键。
            【解决方案9】:

            无法添加评论,没有足够的代表点数,但这是对那些说sp_Pkeys 不可用的人的回应。不一定是答案的另一条评论中提到的功能。

            DECLARE @tbl TABLE
            (
              Table_Qualifier varchar(30), 
              Table_Owner varchar(30), 
              Table_Name varchar(50), 
              Column_Name varchar(30), 
              Key_Seq int,
              PK_Name varchar(50)
            )
            
            insert into @tbl EXEC sp_Pkeys 'tablename'
            
            select * from @tbl
            

            【讨论】:

              【解决方案10】:

              如果您已经知道感兴趣的密钥的名称,请执行以下操作:

              -- Assuming you have schema "Example" and the primary key name is "PK_Item"
              -- Notice that name of table is irrelevant here but is "Foobar" here
              IF (OBJECT_ID('Example.PK_ITEM') IS NULL)
              BEGIN
                  ALTER TABLE [Example].Foobar ADD CONSTRAINT
                  PK_Item PRIMARY KEY ...
              END
              

              【讨论】:

              • 如果 OP 试图查找表的主键,为什么依赖于知道表的主键的答案会有用?
              • 我想我将“确定”解释为“检测是否存在”
              猜你喜欢
              • 1970-01-01
              • 2010-10-27
              • 2021-11-14
              • 1970-01-01
              • 1970-01-01
              • 2011-05-04
              • 2011-03-07
              • 1970-01-01
              • 2011-06-18
              相关资源
              最近更新 更多