Невозможно удалить УНИКАЛЬНЫЙ индекс из таблицы

Когда я запускаю этот запрос

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

Я получил это сообщение:

Ошибка 1018: неправильный синтаксис рядом с «ИНДЕКС». Если это предназначено как часть табличной подсказки, теперь требуются ключевое слово 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")
)
;

Любая идея, как я могу удалить этот индекс? Я знаю, что могу удалить таблицу и создать ее снова, я хочу этого избежать.


person Perimosh    schedule 06.03.2015    source источник
comment
Название уникального индекса, по праву, UNIQUE. Это ужасное имя для индекса. Я бы использовал idx_room_room или idxu_room_room для имени индекса.   -  person Gordon Linoff    schedule 06.03.2015
comment
Почему у вас есть идентификатор столбца, определенный как NOT NULL со значением по умолчанию NULL???? В этом нет абсолютно никакого смысла. Эта вещь кричит о том, что она нуждается в серьезной переработке.   -  person Sean Lange    schedule 06.03.2015
comment
и это автоматически сгенерированное имя: я готов поспорить на что угодно, что SQL Server не сгенерировал автоматически имя Unique для вашего индекса.   -  person Tab Alleman    schedule 06.03.2015
comment
Совершенно верно. Но эта таблица создания, возможно, автоматически создается клиентом сервера sql, который я использую.   -  person Perimosh    schedule 06.03.2015


Ответы (2)


Вам нужно использовать это утверждение:

DROP INDEX [UNIQUE] ON dbo.Room 

Вам нужно удалить индекс, а также определить, в какой таблице он был создан... и, поскольку его имя является зарезервированным ключевым словом SQL, вам нужно поместить его в квадратные скобки ([UNIQUE]).

Дополнительные сведения см. в официальной документации MSDN на 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)

и тогда ваш уникальный индекс тоже исчезнет.

person marc_s    schedule 06.03.2015
comment
Затем проверьте, как на самом деле называются эти индексы на Room, с помощью этой команды: SELECT * FROM sys.indexes WHERE object_id=OBJECT_ID('dbo.Room') - я сомневаюсь, что имя индекса действительно UNIQUE .... используйте соответствующее фактическое имя индекса .... - person marc_s; 06.03.2015
comment
Сказать, что это не сработало, гораздо менее полезно, чем сказать, какое сообщение об ошибке или другой неожиданный результат вы получили. - person Tab Alleman; 06.03.2015
comment
Та же ошибка Tab Alleman. Я попытался поднять имена индексов. И названия не очень описательные. Я не уверен, какой из них я должен удалить. Я вижу, что есть столбец с именем is_unique_constraint, и только один из них имеет значение true. Может быть, это тот, кого я ищу? - person Perimosh; 06.03.2015
comment
Я пытался удалить тот, который показывает is_unique_constraint = true, и не могу. Сервер sql не позволяет мне это сделать, потому что он говорит, что индекс обеспечивает ограничение уникального ключа. Я удалил еще один, но когда я пытаюсь вставить повторяющуюся запись в таблицу, снова появляется уникальное ограничение. - person Perimosh; 06.03.2015
comment
Что ж, если ваш уникальный индекс накладывает уникальное ограничение, вам нужно выяснить, что это за ограничение (его имя), а затем удалить это ограничение (не индекс). - person marc_s; 06.03.2015
comment
@Perimosh: обновил мой ответ, добавив шаги, как узнать, какие уникальные ограничения у вас есть, и как их удалить (что также приведет к удалению уникального индекса в фоновом режиме) - person marc_s; 06.03.2015
comment
Ты рок человек! Огромное спасибо! Работал. Небольшая поправка: SELECT name, TableName = OBJECT_NAME(parent_object_id) FROM sys.key_constraints WHERE type = 'UQ' and parent_object_id = OBJECT_ID('dbo.name_of_table') - person Perimosh; 09.03.2015

Первый шаг, получение индексов

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] 
person AgungPanduan.Com    schedule 28.07.2021