SQL Server, как удалить личность из столбца - PullRequest
20 голосов
/ 31 марта 2009

Есть ли простой способ удалить удостоверение из таблицы в SQL Server 2005?

Когда я использую Management Studio, он генерирует скрипт, который создает зеркальную таблицу без идентификатора, копирует данные, удаляет таблицу, затем переименовывает зеркальную таблицу и т. Д. Этот скрипт содержит 5231 строку, потому что эта таблица / столбец У меня много отношений с ФК.

Я бы чувствовал себя намного комфортнее, выполняя простое изменение / падение. Есть идеи?

EDIT
Я думаю, что я просто собираюсь пойти с 5231 строковым сценарием от Enterprise Manager. Тем не менее, я собираюсь разбить его на более мелкие части, которые я могу управлять и лучше контролировать. Эта таблица «ведет себя» странно, если вы попытаетесь удалить 1 строку (даже одну, которую вы только что вставили, чего нет ни в одной другой таблице FK), вы получите эту ошибку:

delete MyTable where MyPrimaryKey=1234  

Msg 8621, Level 17, State 2, Line 1
    The query processor ran out of stack space during query optimization. Please simplify the query.

Без сомнения, все ФК. Мы остановим весь доступ к нашему приложению и запустим его в однопользовательском режиме, когда внесем изменения в схему и связанные приложения. Тем не менее, нам нужно, чтобы это работало быстро, и мне нужно знать, сколько времени это займет. Я думаю, что мне просто нужно проверить, проверить, проверить.

Ответы [ 3 ]

32 голосов
/ 07 сентября 2011

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

Пример кода, бесстыдно украденного из обходного пути Пола Уайта на этом элементе Microsoft Connect .

USE tempdb;
GO
-- A table with an identity column
CREATE TABLE dbo.Source 
(row_id INTEGER IDENTITY PRIMARY KEY NOT NULL, data SQL_VARIANT NULL);
GO
-- Some sample data
INSERT dbo.Source (data)
VALUES (CONVERT(SQL_VARIANT, 4)),
        (CONVERT(SQL_VARIANT, 'X')),
        (CONVERT(SQL_VARIANT, {d '2009-11-07'})),
        (CONVERT(SQL_VARIANT, N'áéíóú'));
GO
-- Remove the identity property
BEGIN TRY;
    -- All or nothing
    BEGIN TRANSACTION;

    -- A table with the same structure as the one with the identity column,
    -- but without the identity property
    CREATE TABLE dbo.Destination 
    (row_id INTEGER PRIMARY KEY NOT NULL, data SQL_VARIANT NULL);

    -- Metadata switch
    ALTER TABLE dbo.Source SWITCH TO dbo.Destination;

    -- Drop the old object, which now contains no data
    DROP TABLE dbo.Source;

    -- Rename the new object to make it look like the old one
    EXECUTE sp_rename N'dbo.Destination', N'Source', 'OBJECT';

    -- Success
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    -- Bugger!
    IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;
    PRINT ERROR_MESSAGE();
END CATCH;
GO

-- Test the the identity property has indeed gone
INSERT dbo.Source (row_id, data)
VALUES (5, CONVERT(SQL_VARIANT, N'This works!'))

SELECT row_id,
        data
FROM    dbo.Source;
GO

-- Tidy up
DROP TABLE dbo.Source;
8 голосов
/ 01 апреля 2009

Я не верю, что вы можете напрямую удалить часть столбца IDENTITY. Ваша лучшая ставка, вероятно,:

  • добавить еще один неидентичный столбец в таблицу
  • скопировать значения идентификаторов в этот столбец
  • удалить исходный столбец идентификации
  • переименуйте новый столбец, чтобы заменить исходный столбец

Если столбец идентификаторов является частью ключа или другого ограничения, вам нужно будет удалить эти ограничения и заново создать их после завершения вышеуказанных операций.

5 голосов
/ 01 апреля 2009

Вы можете добавить в таблицу столбец, который не является столбцом идентификаторов, скопировать данные, удалить исходный столбец и переименовать новый столбец в старый столбец и заново создать индексы.

Здесь - ссылка, которая показывает пример. Все еще не простое изменение, но это, безусловно, лучше, чем 5231 строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...