【问题标题】:sql server script While creating Index, Getting duplicate key was found for the object namesql server 脚本在创建索引时,找到对象名称的重复键
【发布时间】:2016-02-23 18:21:39
【问题描述】:

我收到以下错误

CREATE UNIQUE INDEX 语句终止,因为发现对象名称“dbo.MY_TABL”和索引名称“idxReqId”的重复键。重复键值为 (0)。

脚本改变表,添加列,最后添加一个唯一的非聚集索引。脚本在这一行失败

CREATE UNIQUE NONCLUSTERED INDEX idxReqId ON [dbo].[MY_TABL](MY_REQID)

我做了以下查询:

SELECT * FROM sys.indexes WHERE name='idxReqId' AND object_id = OBJECT_ID('[dbo].[MY_TABL]')

我一无所获

我查询了SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID('[dbo].[MY_TABL]') 并返回 1,但它是针对 CLUSTERED 索引的。

我不知道如何克服这个错误。任何帮助表示赞赏。

USE [TestWebDb2_Local]
GO



 SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

SET XACT_ABORT ON
GO

BEGIN TRANSACTION

BEGIN TRY 

    IF COLUMNPROPERTY(OBJECT_ID('[dbo].[MY_TABL]'), 'MY_REQID', 'ColumnId') IS NULL
    BEGIN
        ALTER TABLE [dbo].[MY_TABL] ADD MY_REQID INT NOT NULL DEFAULT(0) 
    END

    IF COLUMNPROPERTY(OBJECT_ID('dbo.MY_TABL'), 'MY_ISCOMPLETED', 'ColumnId') IS NULL
    BEGIN
        ALTER TABLE [dbo].[MY_TABL] ADD MY_ISCOMPLETED BIT NOT NULL DEFAULT(0)
    END
END TRY
BEGIN CATCH
        -- Test whether the transaction is uncommittable.
        IF (XACT_STATE()) = -1
        BEGIN

            PRINT 'The transaction from Alter table is in an uncommittable state.' +
                  ' Rolling back transaction.'
            ROLLBACK TRANSACTION;
        END;
END CATCH;
GO 


 BEGIN TRY 
    UPDATE [dbo].[MY_TABL] SET MY_REQID = 20 WHERE MY_SHORT_NAME = '1035'
    UPDATE [dbo].[MY_TABL] SET MY_REQID = 37, MY_ISCOMPLETED = 1 WHERE MY_SHORT_NAME = 'ABVRPARA'

END TRY
BEGIN CATCH
        IF (XACT_STATE()) = -1
        BEGIN
            PRINT 'The transaction from UPDATE table is in an uncommittable state.' +
                  ' Rolling back transaction.'
            ROLLBACK TRANSACTION;
        END;
END CATCH;


BEGIN TRY
        CREATE UNIQUE NONCLUSTERED INDEX idxReqId ON [dbo].[MY_TABL](MY_REQID)
        PRINT 'Index created'
END TRY
BEGIN CATCH
        -- Test whether the transaction is uncommittable.
        IF (XACT_STATE()) = -1
        BEGIN
            DECLARE @ErrorMessage NVARCHAR(4000);
            DECLARE @ErrorSeverity INT;
            DECLARE @ErrorState INT;

            SELECT 
                @ErrorMessage = ERROR_MESSAGE(),
                @ErrorSeverity = ERROR_SEVERITY(),
                @ErrorState = ERROR_STATE();

            -- Use RAISERROR inside the CATCH block to return error
            -- information about the original error that caused
            -- execution to jump to the CATCH block.
            RAISERROR (@ErrorMessage, -- Message text.
                       @ErrorSeverity, -- Severity.
                       @ErrorState -- State.
                       );


            PRINT 'The transaction from Create Index is in an uncommittable state.' +
                  ' Rolling back transaction.'
            ROLLBACK TRANSACTION;
        END;
END CATCH;
GO

if XACT_STATE() = 1
BEGIN
    COMMIT TRANSACTION  
    PRINT 'Transaction committed.';
END;  

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    运行以下查询

    SELECT MY_REQID, COUNT(*) as COUNT
    FROM [dbo].[MY_TABL]
    GROUP BY MY_REQID
    HAVING COUNT(*) > 1
    

    这将为您提供非唯一的 MY_REQID 列表。要制作此索引,它们必须是唯一的。删除重复项/找出为什么它们不是唯一的,因为您知道哪些/多少记录不是唯一的。

    【讨论】:

    • 由于脚本在创建索引上失败,它从不添加 MY_REQID 列,所以我得到'无效的列名'MY_REQID'
    • 这不是我看到的...我看到的是一个 ALTER 表,它添加了默认值为 0 的该列——表中的每一行对于你想要的东西都有相同的值创建唯一索引。随时告诉我我错了——或者你可以尝试运行我发布的 SQL 并学习一些东西。
    • 运行脚本并进行了选择,但没有出现新列
    • 你确定你做了COMMIT TRANSACTION
    猜你喜欢
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多