我想删除一个主键,然后在一个存储过程中将主键添加到同一列。
我在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
如果第一组约束被删除并提交,我是否应该能够在以前拥有主键的列上添加主键?
更新 我想我知道这个问题。这是因为有一个外键与我想要删除的主键相关联。
我将需要删除与我尝试删除的所有主键相关联的所有外键。然后添加主键。然后添加外键。
答案 0 :(得分: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*/