【问题标题】:How can I change primary key on SQL Azure如何更改 SQL Azure 上的主键
【发布时间】:2011-04-13 06:15:20
【问题描述】:

我将更改 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.

【问题讨论】:

    标签: azure-sql-database


    【解决方案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 并支持堆。因此,您可以删除主键并重新创建它。

      【讨论】:

      • 与问题完全无关。
      • 这实际上是一个很好的答案。我放弃了旧的 pk,然后在大约一分钟内创建了一个新的主键。过去,我不得不做重命名和导入表的技巧。这很耗时。 V12 具有更多 SQL Server 功能,包括对全文索引的支持。
      • 这个问题是关于 Azure 的。不是独立的数据库。
      • 是的,在 Azure SQl DB v12 中,这是受支持的
      【解决方案3】:

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

      【讨论】:

      【解决方案4】:

      我很感激这对你自己来说可能是晚了,但它可能会帮助其他人。

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

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

      【讨论】:

      • 多么简单的答案啊。实现导出和娱乐有点脑筋急转弯,因为这是我第一次使用所有这些,但最后,它是如此优雅。
      【解决方案5】:

      您可以尝试以下脚本。更改它以适合您的表定义。

      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'
      

      【讨论】:

        猜你喜欢
        • 2015-05-30
        • 2011-02-11
        • 2015-05-14
        • 2012-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多