我要更改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.
答案 0 :(得分:22)
我遇到了这个问题并在论坛上联系了Azure团队。基本上是不可能的。您需要创建一个新表并将数据传输给它。
我所做的是创建一个交易,并在其中执行以下操作:
将旧表重命名为OLD_MyTable。
使用正确的主键创建新表并将其命名为MyTable。
从OLD_MyTable中选择内容 进入MyTable。
删除OLD_MyTable。
您可能还需要在任何约束上调用sp_rename,以免它们发生冲突。
答案 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。而且您不必创建临时表。