2010-10-14 131 views
97

可能重复获取表的主键:
How do you list the primary key of a SQL Server table?SQL服务器:使用SQL查询

我想用SQL查询SQL服务器数据库来获取特定表的主键。

MySQL的我使用以下查询来获取表的主键:

SHOW KEYS FROM tablename WHERE Key_name = 'PRIMARY' 

什么是相当于上面的查询为SQL服务器

,如果有一个查询,将两个MySQL的SQL服务器工作,那么这将是一个理想的情况。

+1

使用INFORMATION_SCHEMA.VIEWS时要小心,因为他们不能可靠地返回CONSTRAINT_SCHEMA和TABLE_SCHEMA(参见,例如:http://msdn.microsoft.com/en-us /library/ms181757.aspx)有关此问题的讨论,请查看此MSDN主题 http://social.msdn.microsoft.com/Forums/zh-CN/transactsql/thread/732bd071-2c1f-4c23-9215-4ff3822c63c3 – Naomi 2012-11-30 01:37:03

回答

49

发现了另外一个:

SELECT KU.table_name as TABLENAME,column_name as PRIMARYKEYCOLUMN 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC 
INNER JOIN 
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KU 
      ON TC.CONSTRAINT_TYPE = 'PRIMARY KEY' AND 
      TC.CONSTRAINT_NAME = KU.CONSTRAINT_NAME AND 
      KU.table_name='yourTableName' 
ORDER BY KU.TABLE_NAME, KU.ORDINAL_POSITION; 

我已经测试此SQL Server上2003/2005

+4

这一个重要的是它以**的顺序给你PK字段**。有时很重要! – Kip 2013-01-31 22:00:34

+0

另一个版本,它们在逗号分隔列表中的顺序是这里:http://stackoverflow.com/a/42985271/1339704 – Soenhay 2017-03-23 20:00:54

+0

使用'information_schema'(相对于'sys。'观点)总是一个好主意,因为它是官方标准,并且在其他数据库系统中实施。 – Jakub 2017-11-04 17:49:12

9

从内存中,它要么这个

SELECT * FROM sys.objects 
WHERE type = 'PK' 
AND object_id = OBJECT_ID ('tableName') 

或这个..

SELECT * FROM sys.objects 
WHERE type = 'PK' 
AND parent_object_id = OBJECT_ID ('tableName') 

我认为他们中的一个可能应该做工取决于数据的存储方式 但恐怕我有没有访问SQL来实际验证相同。

47

使用SQL Server 2005,你可以尝试

SELECT i.name AS IndexName, 
     OBJECT_NAME(ic.OBJECT_ID) AS TableName, 
     COL_NAME(ic.OBJECT_ID,ic.column_id) AS ColumnName 
FROM sys.indexes AS i INNER JOIN 
     sys.index_columns AS ic ON i.OBJECT_ID = ic.OBJECT_ID 
           AND i.index_id = ic.index_id 
WHERE i.is_primary_key = 1 

找到在SQL SERVER – 2005 – Find Tables With Primary Key Constraint in Database

+0

Where将在上面的查询中放置我想要的表名(所需的主键)? – Awan 2010-10-15 14:08:28

+0

非常好,因为它按照出现顺序显示它们而不是A-Z – 2014-04-24 11:59:46

+0

该查询的运行速度比我的小而空的数据库上最高的答案快得多。 – Gobe 2016-02-13 20:20:38

4
select * 
from sysobjects 
where xtype='pk' and 
    parent_obj in (select id from sysobjects where name='tablename') 

这将在SQL 2005

+0

如果您发布的是代码或XML,请**在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码”按钮(101 010)以精确地设置格式并对其进行语法突出显示! – 2010-10-14 06:04:34

+1

另外,在SQL Server 2005及更高版本中,建议使用'sys'目录视图并停止使用传统的'sysobjects'表。所以在你的情况下,使用'sys.tables'和'sys.columns'和其他sys目录视图。 – 2010-10-14 06:05:28

3

的代码工作,我会给你的工作,并没有检索只有密钥,但来自SQL Server中一个表的大量数据。在SQL Server 2k5/2k8中测试,不知道约2k。请享用!

SELECT DISTINCT 
    sys.tables.object_id AS TableId, 
    sys.columns.column_id AS ColumnId, 
    sys.columns.name AS ColumnName, 
    sys.types.name AS TypeName, 
    sys.columns.precision AS NumericPrecision, 
    sys.columns.scale AS NumericScale, 
    sys.columns.is_nullable AS IsNullable, 
    ( SELECT 
      COUNT(column_name) 
     FROM 
      INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 
     WHERE 
      TABLE_NAME = sys.tables.name AND 
      CONSTRAINT_NAME = 
       ( SELECT 
        constraint_name 
        FROM 
         INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
        WHERE 
         TABLE_NAME = sys.tables.name AND      
         constraint_type = 'PRIMARY KEY' AND 
         COLUMN_NAME = sys.columns.name 
       ) 
    ) AS IsPrimaryKey, 
    sys.columns.max_length/2 AS CharMaxLength /*BUG*/ 
FROM 
    sys.columns, sys.types, sys.tables 
WHERE 
    sys.tables.object_id = sys.columns.object_id AND 
    sys.types.system_type_id = sys.columns.system_type_id AND 
    sys.types.user_type_id = sys.columns.user_type_id AND 
    sys.tables.name = 'TABLE' 
ORDER BY 
    IsPrimaryKey 

只能使用主键的一部分,但我认为剩下的可能变得得心应手。 最好的问候, 大卫

123

我还发现了一个又一个的SQL Server:

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

它不在SQL Server 2005上运行。我添加了另一个对SQL Server 2003和SQL Server 2005有用的答案。 – Awan 2010-10-15 14:02:54

+2

不知道为什么,但OBJECTPROPERTY(OBJECT_ID(constraint_name),'IsPrimaryKey')在我的返回NULL案件。下面的解决方案工作正常。也许你的解决方案不适用于复杂的PK(2列以上)。 – nZeus 2014-03-12 10:31:11

+3

如果您遇到同样的问题,那么对象属性函数将返回null,因为如果约束附加到不在dbo模式中的对象,则对象id函数将返回null。您必须将约束模式连接到对象id函数内的约束名称。希望这可以帮助别人。 – jwhaley58 2014-03-26 15:10:27

1

这也是(的Transact-SQL)......根据BOL。

-- exec sp_serveroption 'SERVER NAME', 'data access', 'true' --execute once 

EXEC sp_primarykeys @table_server = N'server_name', 
    @table_name = N'table_name', 
    @table_catalog = N'db_name', 
    @table_schema = N'schema_name'; --frequently 'dbo' 
4

这应当列出所有的约束条件,并在结束时,你可以把你的过滤器

/* 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

5
SELECT COLUMN_NAME FROM {DATABASENAME}.INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME LIKE '{TABLENAME}' AND CONSTRAINT_NAME LIKE 'PK%' 

WHERE
{} DATABASENAME从你的服务器=您的数据库和
{TABLENAME} =从中你想看到的主键的表名。

注意:输入您的数据库名称和没有括号的表名称。

2

请记住,如果您想获得确切的主字段,则需要将TABLE_NAME和TABLE_SCHEMA放入条件中。

这个解决方案应该工作:

select COLUMN_NAME from information_schema.KEY_COLUMN_USAGE 
where CONSTRAINT_NAME='PRIMARY' AND TABLE_NAME='TABLENAME' 
AND TABLE_SCHEMA='DATABASENAME' 
+1

CONSTRAINT_NAME并不总是“PRIMARY” – frostymarvelous 2015-06-27 12:24:17