2011-04-13 50 views
18

我将更改SQL Azure上的主键。但是当使用Microsoft SQL Server Management Studio生成脚本时会引发错误。因为SQL Azure上的每个表都必须包含主键。我无法在创建之前删除它。如果我必须改变它,我该怎么办?如何更改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. 

回答

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

3

你可以试试下面的脚本。改变它以适合你的桌子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' 
4

我明白,这可能对你自己来说很晚,但它可以帮助别人。

我最近遇到这个问题,发现最痛苦的解决方案是从Azure下载数据库,在本地恢复它,在本地更新主键(因为关键约束是SQL Azure特定问题),然后恢复数据库返回到Azure。

这节省了重命名数据库或在它们之间传输数据的问题。

+0

多么奇妙的简单答案。实施出口和娱乐是一个大脑的转折,因为这是我第一次这么做,但最终它非常优雅。 – krillgar 2015-05-18 01:18:37

6

升级SQL V12和堆支持它。所以你可以放弃主键并重新创建它。

+1

与问题完全无关。 – Casey 2015-07-01 18:02:58

+1

这实际上是一个很好的答案。我放弃了我的旧PK,然后在一分钟内创建了一个新的主键。在过去,我不得不做重命名和导入表格技巧。这是非常耗时的。 V12具有更多的SQL Server功能,包括对全文本索引的支持。 – 2015-07-03 18:43:41

+0

这个问题是关于Azure的。不是独立的数据库。 – 2015-09-03 04:41:47

0

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