Подтвердить что ты не робот

Как изменить первичный ключ на SQL Azure

Я собираюсь изменить первичный ключ на SQL Azure. Но он генерирует ошибку при использовании Microsoft SQL Server Management Studio для генерации сценариев. Поскольку все таблицы в SQL Azure должны содержать первичный ключ. И я не могу отказаться от него, прежде чем создавать. Что я могу сделать, если я должен изменить его?

Script сгенерировано

IF  EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[mytable]') AND name = N'PK_mytable')
ALTER TABLE [dbo].[mytable] DROP CONSTRAINT [PK_mytable]
GO

ALTER TABLE [dbo].[mytable] ADD  CONSTRAINT [PK_mytable] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF)
GO

Сообщение об ошибке

Msg 40054, Level 16, State 2, Line 3
Tables without a clustered index are not supported in this version of SQL Server. Please create a clustered index and try again.
Msg 3727, Level 16, State 0, Line 3
Could not drop constraint. See previous errors.
The statement has been terminated.
Msg 1779, Level 16, State 0, Line 3
Table 't_event_admin' already has a primary key defined on it.
Msg 1750, Level 16, State 0, Line 3
Could not create constraint. See previous errors.
4b9b3361

Ответ 1

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

То, что я сделал, это создать транзакцию и внутри нее сделать следующее:

  • Переименовал старую таблицу в OLD_MyTable.

  • Создайте новую таблицу с правильным Первичным ключом и вызовите ее MyTable.

  • Выберите содержимое из OLD_MyTable в MyTable.

  • Снимите OLD_MyTable.

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

Смотрите также: http://social.msdn.microsoft.com/Forums/en/ssdsgetstarted/thread/5cc4b302-fa42-4c62-956a-bbf79dbbd040

Ответ 2

обновление SQL V12 и кучи поддерживаются на нем. Таким образом, вы можете удалить первичный ключ и заново создать его.

Ответ 3

Я ценю, что это может быть поздно в тот же день для вас, но это может помочь другим.

Недавно я столкнулся с этой проблемой и нашел, что наименее болезненным решением было загрузить базу данных из Azure, локально восстановить ее, локально обновить первичный ключ (поскольку ключевое ограничение является специфической проблемой SQL Azure), а затем восстановить базу данных обратно в Лазурь.

Это спасло любые проблемы в отношении переименования баз данных или передачи данных между ними.

Ответ 4

Вы можете попробовать следующие скрипты. Измените его в соответствии с таблицей def.

EXECUTE sp_rename N'[PK_MyTable]', N'[PK_MyTable_old]',  'OBJECT'

CREATE TABLE [dbo].[Temp_MyTable](
[id] [int] NOT NULL,
[text] [text] NOT NULL CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED (
[id] ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON))

INSERT INTO dbo.[Temp_MyTable] (Id, Text)
SELECT Id, Text FROM dbo.MyTable

drop table dbo.MyTable
EXECUTE sp_rename N'Temp_MyTable', N'MyTable', 'OBJECT'

Ответ 5

Этот вопрос устарел, поскольку изменение PK уже поддерживается в последней версии SQL Azure. И вам не нужно создавать временную таблицу.