【问题标题】:How to Query to Find out if a Table has a CLUSTERED Primary Key如何查询表是否具有 CLUSTERED 主键
【发布时间】:2014-02-05 16:55:26
【问题描述】:

我找到了这个问题,但它似乎没有回答这个问题......

SQL Server - How to find if clustered index exists

如何写一个 IF T-SQL 语句来表示:

IF NOT ([TableName] has a CLUSTERED PK)
   ALTER TABLE to add the CLUSTERED PK 

【问题讨论】:

标签: sql tsql primary-key clustered-index


【解决方案1】:

我不确定这是否仍然是问题,但也许它会帮助另一个人。

请在下面找到代码部分:

SELECT COL_NAME(ic.object_id,ic.column_id) AS 'column name', 
i.object_id, i.name, i.type_desc, ds.name, ds.type_desc FROM sys.indexes i
INNER JOIN sys.data_spaces ds ON i.data_space_id = ds.data_space_id 
INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
WHERE i.object_id = OBJECT_ID('NameOfYourTableWithSchemaIncluded')

希望它可以帮助任何人! 最好的问候。

【讨论】:

    【解决方案2】:

    试试这个

    IF NOT EXISTS (SELECT * 
                   FROM sys.indexes 
                   WHERE object_id = OBJECT_ID('dbo.MdsInventar') 
                     AND index_id = 1
                     AND is_primary_key = 1)
       ......
    

    聚集索引总是有index_id = 1。当然 - 如果你像这样检查(使用is_primary_key = 1 条件),那么总有可能存在非主索引 表上已经有聚集索引 - 因此您将无法创建另一个聚集索引。因此,也许您需要丢失 AND is_primary_key = 1 条件并仅检查“是否存在聚集索引”。

    更新: 或者如果使用 index_id = 1 对您来说是黑魔法,您也可以改用 type 列:

    IF NOT EXISTS (SELECT * 
                   FROM sys.indexes 
                   WHERE object_id = OBJECT_ID('dbo.MdsInventar') 
                     AND type = 1
                     AND is_primary_key = 1)
       ......
    

    【讨论】:

    • 我认为过滤索引类型而不是(某种)魔法 index_id 会更自描述。
    • @usr:是的,你也可以这样做 - 但index_id = 1 几乎不是“魔法” - it's well known, well documented ...另外:知道type = 1 是聚集索引也有点“魔法”,不是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 2017-07-30
    • 1970-01-01
    • 2022-10-06
    相关资源
    最近更新 更多