2016-09-22 96 views
0

我想删除主键,然后将主键添加到1存储过程中的同一列。在一个存储过程中删除和添加约束

我在Begin Transaction' and提交交易then try to add the constraints within another set of开始交易and提交交易``有下降限制。

我收到错误消息,指出该列在第一组事务中被删除时,该主键已存在。

这是代码:

BEGIN TRANSACTION 

ALTER TABLE [dbo].[Lens] DROP CONSTRAINT [FK_Lens_Style]; 
ALTER TABLE [dbo].[Lens] DROP CONSTRAINT [FK_Lens_Type]; 
ALTER TABLE [dbo].[Coating] DROP CONSTRAINT [PK_Coatings]; 
ALTER TABLE [dbo].[CoatingCost] DROP CONSTRAINT [PK_CoatingCost]; 

COMMIT TRANSACTION 

BEGIN TRANSACTION 

    ALTER TABLE [dbo].[Coating] 
     ADD CONSTRAINT [PK_dbo.Coating] 
     PRIMARY KEY CLUSTERED ([CoatingId] ASC) 
        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
         IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
         ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

COMMIT TRANSACTION 

如果第一组约束被丢弃,并承诺,我不应该能够添加上以前有一个主键列主键?

UPDATE 我想我知道这个问题。这是因为有一个外键与我试图放弃的主键关联。

我将需要删除所有与我试图放下的所有主键相关的外键。然后添加主键。然后再添加外键。

+0

尝试'DISABLE'和'ENABLE',而不是'DROP'和'ADD' – techspider

+0

我不得不辍学该限制因为它需要被重命名或永久删除。 –

+0

这不会像那样工作。要在单个过程中执行此操作,需要将代码移至动态SQL。这是因为编译器会引发异常,因为该表已经有一个主键。它不会通过您的逻辑来确定主键已被删除。我会质疑为什么你首先需要一个存储过程。你真的放弃并重新创建主键,你需要一个过程吗? –

回答

0

您确定在您的代码尝试创建一个时,问题与数据库中存在的索引名称不同吗?索引的名称在整个数据库范围中必须是唯一的,不仅在单个表范围中。 你可能想通过将一个低于查询之前,与您的交易操作后,诊断是:

SELECT 
    so.name AS tableName 
    , si.name AS indexName 
    , si.type_desc AS indexType 
    , si.is_primary_key AS isPK 
    FROM 
    sys.indexes AS si 
    JOIN sys.objects AS so ON si.object_id = so.object_id 
    WHERE 
    si.name IS NOT NULL /*otherwise it will select all tables without explicit index*/ 
    AND 
    so.type = 'U'/*otherwise it unnecessarily will select indexes of system tables*/ 
+0

不。问题似乎是,在存储过程的开始处,我放弃了名为** PK_Coatings **的主键**表** Coating **,然后执行交易。然后尝试为表** Coating添加主键约束** PK_dbo.Coating **,并失败,因为它报告表** Coating的主键**。但我放弃了它,并承诺它。那为什么它仍然存在? –