代码之家  ›  专栏  ›  技术社区  ›  rein

使用TSQL确定表的主键

  •  47
  • rein  · 技术社区  · 16 年前

    我想使用TSQL(存储过程或系统表可以)确定表的主键。SQL Server(2005或2008)中是否存在这样的机制?

    9 回复  |  直到 7 年前
        1
  •  69
  •   Ben Gripka Javed Akram    7 年前

    这应该让你开始:

    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'
    
        2
  •  37
  •   Indeed is Trash    16 年前

    怎么样

    sp_pkeys 'TableName'
    
        3
  •  19
  •   Philip Kelley    16 年前

    这里有一个基于SQL 2005中的系统表(99%的人确信它在2008年可以工作)。这将列出所有用户定义表的所有pk,其中包含所有列和一些可以删除的额外fluff。添加参数以一次选择一个表。

    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
  •  17
  •   LukeH    16 年前
    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'
    
        5
  •  4
  •   chugh97    16 年前
    EXEC sp_Pkeys @tableName
    
        6
  •  3
  •   Tim Cooper    13 年前
    exec [sys].[sp_primary_keys_rowset] @table_name= 'TableName'
    
        7
  •  1
  •   JT Turner    11 年前

    最简单的方法就是这样!

    select object_id from sys.objects 
    where parent_object_id = OBJECT_ID(N'FACounty')
    and [type] = N'PK'
    
        8
  •  1
  •   sqlconsumer.net    10 年前

    你最好使用information_schema.key_column_用法,因为你可以访问密钥排序信息(顺序_位置),这一点非常重要。

    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
    
        9
  •  0
  •   Pasi Savolainen    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