2017-06-07 20 views
0

Wenn ich dieses Skript verwenden:Ein Objekt mit dem Namen existiert bereits in der Datenbank nur, wenn ich Einschränkung verwenden

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

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

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

ich einen Fehler

Ein Objekt mit dem Namen ‚TableX‘ bereits erhalten existieren in der Datenbank

aber das ist nur, wenn ich die CONSTRAINT Zeile verwende.

Warum erhalte ich nur einen Fehler, wenn ich CONSTRAINT verwende und wie kann ich es lösen?

Antwort

3

Das liegt daran, dass Ihr Constaint-Name mit dem Tabellennamen identisch ist. Nennen Sie es wie PK_TableX

+0

Vielen Dank Anton, die es zu lösen, aber ich habe ein anderes Skript, wo ich den Tabellennamen in der Einschränkung und funktioniert gut. –

+1

Es ist eine allgemeine Praxis, Präfixe für verschiedene Objekttypen zu verwenden, wie PK_ für Primärschlüssel, FK_ für Fremdschlüssel, UQ_ für eindeutige Einschränkungen, DF_ für Standardwerte usw. Die Eindeutigkeitsanforderung für Objektnamen ist nicht gut dokumentiert in der SQL Server-Version oder wann/wo/wie das Objekt erstellt wurde. – Anton

1

Tabellen und Einschränkungen werden alle als Objekte in der SQL Server-Datenbank behandelt. Überprüfen Sie sys.objects Systemtabelle.

Sie können also nicht denselben Namen für Tabelle und Einschränkung haben. Wenn Sie die create-Anweisung ausführen, erstellt SQL Server zuerst die Tabelle und versucht dann, die Einschränkung zu erstellen, die fehlschlägt, da der Name in Tabelle sys.objects bereits vorhanden ist.

Versuchen Sie einen anderen Namen für die Primärschlüsseleinschränkung. Gemäß den Standards haben Primärschlüssel das Präfix PK_. Also hier können Sie Ihren Primärschlüssel als PK_TableX

+2

Das ist nicht korrekt. Sie können einen Index mit dem gleichen Namen wie Tabellenname mindestens in SQL 2016 erstellen. Der Index befindet sich nicht in der Tabelle sys.objects, nur constraint, btw. Das Problem war mit Constraint-Name. – Anton

+0

@Anton: meine schlechte, bezog sich auf die Constraint nicht Index. bearbeitet. – Santhosh

Verwandte Themen