2015-03-06 2 views
0

Когда я запускаю этот запросНевозможно удалить уникальный индекс из таблицы

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

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

Ошибка 1018: Неправильный синтаксис около 'INDEX'. Если это предназначено как часть подсказки таблицы, теперь требуется ключевое слово A WITH и скобки. См. SQL Server Books Online для правильного синтаксиса.

Название уникального индекса, справедливо, UNIQUE. Я думаю, что это проблема, и это автогенерированное имя (для клиента SQL Server, который использовался для создания этого индекса). Это предложение для создания таблицы:

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

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

+4

«Название уникального индекса, справедливо, УНИКАЛЬНО». Это ужасное имя для индекса. Я бы использовал 'idx_room_room' или' idxu_room_room' для имени индекса. –

+2

Почему у вас есть идентификатор столбца, определенный как NOT NULL со значением по умолчанию NULL ???? Это совершенно не имеет смысла. Эта вещь кричит о том, что она серьезно нуждается в полной редизайне. –

+2

«и это автогенерированное имя»: я готов сделать ставку на все, что SQL Server не автоматически генерирует имя «Уникальный» для вашего индекса. –

ответ

5

Вы должны использовать это заявление:

DROP INDEX [UNIQUE] ON dbo.Room 

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

Смотрите official MSDN documentation on DROP INDEX для более подробной информации

Update: если это утверждение не работает, то, что индекс не называетсяUNIQUE в конце концов.

Проверьте, какие индексы определяются на Room столе с этим утверждением:

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

и посмотреть на Name колонки - затем используйте соответствующего, фактическое имя индекса падения этого индекса.

Update # 2: ОК, так что вы действительно есть ограничение уникальности, которое вынужденное этим уникальным индексом. Поэтому для того, чтобы избавиться от этого, сначала нужно выяснить, что это ограничение называется, и в какой таблице он находится на:

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

После того, как у вас есть эти две части информации, теперь вы можете отбросить это ограничение:

ALTER TABLE (TableName) 
DROP CONSTRAINT (ConstraintName) 

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

+0

Не работал .. Я не знаю, что происходит – Perimosh

+0

Затем проверьте, какие именно индексы на 'Room' действительно вызываются с помощью этой команды:' SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID ('dbo.Room') '- Я сомневаюсь, что имя индекса действительно является' UNIQUE' ... использовать ** соответствующее **, фактическое имя индекса .... –

+1

Говорить «Не работал» гораздо менее полезно, чем говорить, какая ошибка сообщение или другой неожиданный результат. –

 Смежные вопросы

  • Нет связанных вопросов^_^