2017-06-07 31 views
0

當我使用這個腳本:一個名爲對象在數據庫中已存在只是當我使用約束

IF OBJECT_ID('dbo.TableX', 'U') IS NOT NULL 
    DROP TABLE dbo.TableX 

CREATE TABLE TableX 
(
    ... 
    ... 
    ... 

    CONSTRAINT TableX PRIMARY KEY (column1, column2, column3) 
) 

我得到一個錯誤

名爲「的TableX」已經是一個對象存在數據庫中

但這只是當我使用CONSTRAINT行。

爲什麼我只在使用CONSTRAINT時出現錯誤,我該如何解決?

回答

3

這是因爲您的Constaint名稱與表名相同。將其命名爲PK_TableX

+0

謝謝安東解決它,但我有另一個腳本,我在約束中使用表名並且工作正常。 –

+1

對於不同的對象類型使用前綴是一種慣例,例如主鍵的PK_,外鍵的FK_,唯一約束的UQ_,缺省值的DF_等等。對象名稱的唯一性要求沒有很好的記錄,因此它可能取決於在SQL Server版本或何時/如何/如何創建對象。 – Anton

1

表和約束條件都被視爲SQL Server數據庫中的對象。 檢查sys.objects系統表。

因此,您不能爲表和約束使用相同的名稱。當您運行create語句時,SQL服務器將首先創建表,然後嘗試創建失敗的約束,因爲該表的名稱已存在於sys.objects中。

爲主鍵約束嘗試一個不同的名稱。按照標準,主鍵前綴爲PK_。所以在這裏你可以將你的主鍵命名爲PK_TableX

+2

這是不正確的。至少在SQL 2016上,您可以創建一個與表名相同的索引。索引不在sys.objects表中,只是約束,btw。問題出在約束名稱。 – Anton

+0

@Anton:我的不好,是指約束而不是索引。編輯。 – Santhosh

相關問題