当我运行此查询时
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")
)
;
知道如何删除此索引?我知道我可以放下桌子,再次创建它,我想避免这种情况。
答案 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]