Sql-Server

數據庫中已經有一個名為 PK_MyPrimaryKey 的對象(臨時表上的主索引)

  • August 4, 2021

簡化程式碼

var sql = @" create table #Temp( 
               int Id NOT NULL
               CONSTRAINT [PK_TempId] PRIMARY KEY (Id)
            )
            insert into #temp(id) select (Id) from SomeOtherTable
            select Id from #Temp
            "

       using (var db = new MyDbContext())
           {
               var results = db.Database.SqlQuery<int>(sql).ToList();
               return results;
           }

導致間歇性錯誤

There is already an object named PK_TempId in the database

我已經添加了

drop table #temp

並且正在等待查找是否可以解決問題。

在我添加索引之前,程式碼執行多年沒有任何問題,也沒有明顯需要刪除臨時表。

我在這裡找到了一個建議,即不應在臨時表中使用命名索引。但我不確定有什麼替代方案。

正如 Denis 在評論中指出的那樣,如果您從CREATE TABLE腳本的主鍵部分刪除名稱,它應該可以工作。這是因為您使用的名稱已在其他地方用作主鍵。

這是因為名稱PK_TempId是在另一個表上定義的,如果上面的程式碼同時執行兩次,則該表可能是完全不同的表,也可能是表的第二個實例#Temp這在同一架構中是不允許的。

約束名稱在同一架構中必須是唯一的。

引用自:https://dba.stackexchange.com/questions/297563