Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I change primary key on SQL Azure

I am going to change the primary key on SQL Azure. But it throws an error when using Microsoft SQL Server Management Studio to generate the scripts. Because every tables on SQL Azure must contains a primary key. And I can't drop it before create. What can I do if I must change it?

Script generated

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

Error message

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.
like image 395
Wayne Avatar asked Apr 13 '11 06:04

Wayne


People also ask

What is primary key in Azure?

The Azure table's primary key = PK + RK which means Partition Key + Row Key. As in a relational database table, the primary key in the azure table uniquely identifies each row. The primary key for an Azure table is the combination of PartitionKey and RowKey properties which forms a single clustered index.

Can primary key be changed?

Short answer: yes you can.


3 Answers

I ran into this exact problem and contacted the Azure team on the forums. Basically it isn't possible. You'll need to create a new table and transfer the data to it.

What I did was create a transaction and within it do the following:

  • Renamed the old table to OLD_MyTable.

  • Create the new table with the correct Primary Key and call it MyTable.

  • Select the contents from OLD_MyTable into MyTable.

  • Drop OLD_MyTable.

You may also need to call sp_rename on any constraints so they don't conflict.

See also: http://social.msdn.microsoft.com/Forums/en/ssdsgetstarted/thread/5cc4b302-fa42-4c62-956a-bbf79dbbd040

like image 106
Vyrotek Avatar answered Oct 11 '22 19:10

Vyrotek


upgrade SQL V12 and heaps are supported on it. So you can drop the primary key and recreate it.

like image 43
Sirisha Chamarthi Avatar answered Oct 11 '22 21:10

Sirisha Chamarthi


I appreciate that this may be late in the day for yourself, but it may help others.

I recently came across this issue and found the least painful solution was to download the database from Azure, restore it locally, update the primary key locally (as the key constraint is a SQL Azure specific issue), and then restore the database back into Azure.

This saved any issues in regards to renaming databases or transferring data between them.

like image 43
Matt Jones Avatar answered Oct 11 '22 21:10

Matt Jones