如何在SQL Azure上更改主键

时间:2011-04-13 06:15:21

标签: azure-sql-database

我要更改SQL Azure上的主键。但是,当使用Microsoft SQL Server Management Studio生成脚本时,它会引发错误。因为SQL Azure上的每个表都必须包含主键。在创建之前我不能放弃它。如果我必须改变它,我该怎么办?

生成脚本

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.

5 个答案:

答案 0 :(得分:22)

我遇到了这个问题并在论坛上联系了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

答案 1 :(得分:8)

升级SQL V12并支持堆。因此,您可以删除主键并重新创建它。

答案 2 :(得分:4)

我很欣赏这可能是你自己当天晚些时候,但它可能对其他人有所帮助。

我最近遇到过这个问题并发现最难以解决的解决方案是从Azure下载数据库,在本地还原,在本地更新主键(因为关键约束是SQL Azure特定问题),然后还原数据库回到Azure。

这保存了重命名数据库或在数据库之间传输数据的任何问题。

答案 3 :(得分:3)

您可以尝试以下脚本。改变它以适合你的桌子。

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'

答案 4 :(得分:2)

此问题已过时,因为最新版本的SQL Azure已经支持更改PK。而且您不必创建临时表。