无法从表中删除UNIQUE索引

时间:2015-03-06 18:59:49

标签: sql sql-server unique-index

当我运行此查询时

ALTER TABLE "dbo"."ROOM" DROP INDEX "UNIQUE";

我收到了这条消息:

  

错误1018:'INDEX'附近的语法不正确。如果这是作为表提示的一部分,则现在需要A WITH关键字和括号。有关正确的语法,请参阅SQL Server联机丛书。

唯一索引的名称是UNIQUE。我认为这是问题,它是一个自动生成的名称(用于创建此索引的SQL Server客户端)。这是创建表句子:

CREATE TABLE "ROOM" (
    "ID" BIGINT NOT NULL DEFAULT NULL,
    //the rest of the columns...
    "ROOM" VARCHAR(100),
    UNIQUE INDEX "UNIQUE" ("ROOM")
)
;

知道如何删除此索引?我知道我可以放下桌子,再次创建它,我想避免这种情况。

2 个答案:

答案 0 :(得分:9)

您需要使用以下声明:

DROP INDEX [UNIQUE] ON dbo.Room 

您需要删除索引,并定义在哪个表上创建...并且由于其名称是保留的SQL关键字,您需要将其放入方括号([UNIQUE])。

有关详细信息,请参阅official MSDN documentation on DROP INDEX

更新:如果此声明不起作用,那么毕竟不会调用 UNIQUE索引。

使用以下语句检查Room表中定义的索引:

SELECT * 
FROM sys.indexes 
WHERE object_id=OBJECT_ID('dbo.Room')

并查看Name列 - 然后使用相应的,实际索引名称删除该索引。

更新#2:确定,以便您真正拥有唯一约束,该约束由该唯一索引强制执行。因此,为了摆脱这种情况,首先需要找出调用约束的内容,以及它所在的表:

SELECT 
    name, 
    TableName = OBJECT_NAME(parent_object_id)
FROM sys.key_constraints
WHERE type = 'UQ'

一旦掌握了这两条信息,您现在可以放弃该约束:

ALTER TABLE (TableName)
DROP CONSTRAINT (ConstraintName)

然后您的唯一索引也会消失。

答案 1 :(得分:0)

第一步,获取索引

select schema_name(t.schema_id) + '.' + t.[name] as table_view, 
    case when t.[type] = 'U' then 'Table'
        when t.[type] = 'V' then 'View'
        end as [object_type],
    case when c.[type] = 'PK' then 'Primary key'
        when c.[type] = 'UQ' then 'Unique constraint'
        when i.[type] = 1 then 'Unique clustered index'
        when i.type = 2 then 'Unique index'
        end as constraint_type, 
    c.[name] as constraint_name,
    substring(column_names, 1, len(column_names)-1) as [columns],
    i.[name] as index_name,
    case when i.[type] = 1 then 'Clustered index'
        when i.type = 2 then 'Index'
        end as index_type
from sys.objects t
    left outer join sys.indexes i
        on t.object_id = i.object_id
    left outer join sys.key_constraints c
        on i.object_id = c.parent_object_id 
        and i.index_id = c.unique_index_id
   cross apply (select col.[name] + ', '
                    from sys.index_columns ic
                        inner join sys.columns col
                            on ic.object_id = col.object_id
                            and ic.column_id = col.column_id
                    where ic.object_id = t.object_id
                        and ic.index_id = i.index_id
                            order by col.column_id
                            for xml path ('') ) D (column_names)
where is_unique = 1
and t.is_ms_shipped <> 1 and t.[name]='table name'
order by schema_name(t.schema_id) + '.' + t.[name]

第二步,删除索引

DROP INDEX [INDEXES NAME] ON dbo.[TABLE NAME]