So erstellen Sie eine Tabelle mit einer Identitätsspalte

111

Ich habe eine vorhandene Tabelle, die ich wegblasen werde, weil ich sie nicht mit der IDSpalte erstellt habe, die als Identitätsspalte der Tabelle festgelegt ist.

Mit SQL Server Management Studio habe ich ein "Create To ..." der vorhandenen Tabelle per Skript erstellt und Folgendes erhalten:

CREATE TABLE [dbo].[History](
    [ID] [int] NOT NULL,
    [RequestID] [int] NOT NULL,
    [EmployeeID] [varchar](50) NOT NULL,
    [DateStamp] [datetime] NOT NULL,
 CONSTRAINT [PK_History] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Meine Frage ist, wie würde ich dies ändern, SQLdamit für meine resultierende Tabelle die IDSpalte als Identität festgelegt wird ?

jp2code
quelle
11
[ID] [int] NICHT NULL IDENTITY (1,1)
Li0liQ

Antworten:

153
CREATE TABLE [dbo].[History](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [RequestID] [int] NOT NULL,
    [EmployeeID] [varchar](50) NOT NULL,
    [DateStamp] [datetime] NOT NULL,
 CONSTRAINT [PK_History] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON)
) ON [PRIMARY]
Gratzy
quelle
1
Ich glaube, das habe ich gesucht. Ich muss den PK_HistoryWert nicht ändern IDoder so?
JP2-Code
Nein, das sollte alles sein, was Sie brauchen. PK_History ist nur der Name der Einschränkung. Die Primärschlüsseleinschränkung befindet sich bereits in der Spalten-ID
Gratzy,
1
Was ist die Bedeutung der Parameter IDENTITY (1,1)
otc
4
Identität ( Startwert
Gratzy
33

Dies wurde bereits beantwortet, aber ich denke, die einfachste Syntax ist:

CREATE TABLE History (
    ID int primary key IDENTITY(1,1) NOT NULL,
    . . .

Der kompliziertere Einschränkungsindex ist nützlich, wenn Sie die Optionen tatsächlich ändern möchten.

Übrigens bevorzuge ich es, eine solche Spalte HistoryId zu benennen, damit sie mit den Namen der Spalten in Fremdschlüsselbeziehungen übereinstimmt.

Gordon Linoff
quelle
5
OP arbeitet speziell mit der Ausgabe eines GUI-Tools, das die DDL für ein vorhandenes Objekt ausgibt. Dieses Tool verfügt wahrscheinlich nicht über die Option "Verwenden Sie nach Möglichkeit eine einfachere Syntax". Für die spezifische Situation von OP besteht die geringste Fehleranfälligkeit darin, die eine Zeile in der generierten DDL zu bearbeiten und nicht zu versuchen, sie mit der einfachsten Syntax von Grund auf neu zu schreiben. Auch das von Ihnen angegebene Beispiel weist der PK-Einschränkung keinen Namen zu, wie dies bei OP der Fall ist. Viele bevorzugen meine Einschränkungen, damit sie in allen Umgebungen (dev, test, prod) den gleichen Namen haben. ID int constraint PK_History primary key identity(1,1)Ich glaube.
Shannon Severance
3
Vielleicht, vielleicht nicht. Ich war in Situationen, in denen ich das Skript aus einer Datenbank entnommen und auf einem anderen Server verwendet habe und die Standardeinstellungen, die an einem Ort funktionierten, für den anderen nicht am besten waren. Auf jeden Fall habe ich dies nur als Lösung vorgeschlagen, da es mir einfacher erscheint (ich persönlich verstehe das Schlüsselwort "Primärschlüssel" viel besser als ich die Optionen für eine Einschränkung verstehe und erwäge, Optionen zu verwenden, die ich nicht als "schlecht" verstehe "). Sie machen jedoch einen guten Punkt darüber, warum eine andere Lösung bevorzugt werden könnte. Ich sollte hinzufügen, dass diese Antwort bereits die akzeptierte Antwort ist.
Gordon Linoff
@GordonLinoff: Mate, Primärschlüssel ist standardmäßig nicht null. Warum müssen Sie hier explizit nicht null angeben?
Lerner
@ Lerner. . . Beide Einschränkungen waren im OP-Code enthalten. Das NOT NULList überflüssig.
Gordon Linoff
12
[id] [int] IDENTITY(1,1) NOT NULL,

Da Sie die Tabelle in SQL Server Management Studio erstellen, können Sie natürlich den Tabellen-Designer verwenden, um die Identitätsspezifikation festzulegen.

Geben Sie hier die Bildbeschreibung ein

Phil
quelle
1
Danke Phil. Ich weiß, wie das geht, aber ich kann nicht, weil der Tisch schon da ist. Ich muss die Tabelle löschen und neu erstellen, daher verwende ich das Skript.
JP2-Code
4
@ jp2code: Ich meinte, Sie hätten eine Testtabelle mit einer Identitätsspalte erstellen und diese dann per Skript erstellen können, um zu sehen, wie sie angegeben werden sollte.
Phil
-2

Der eindeutige Schlüssel erlaubt maximal 2 NULL-Werte. Erklärung:

create table teppp
(
id int identity(1,1) primary key,
name varchar(10 )unique,
addresss varchar(10)
)

insert into teppp ( name,addresss) values ('','address1')
insert into teppp ( name,addresss) values ('NULL','address2')
insert into teppp ( addresss) values ('address3')

select * from teppp
null string , address1
NULL,address2
NULL,address3

Wenn Sie versuchen, dieselben Werte wie unten einzufügen:

insert into teppp ( name,addresss) values ('','address4')
insert into teppp ( name,addresss) values ('NULL','address5')
insert into teppp ( addresss) values ('address6')

Jedes Mal erhalten Sie Fehler wie:

Verletzung der UNIQUE KEY-Einschränkung 'UQ__teppp__72E12F1B2E1BDC42'. Es kann kein doppelter Schlüssel in das Objekt 'dbo.teppp' eingefügt werden.
Die Anweisung wurde beendet.

Priyanka
quelle
Ich musste die IDSpalte eindeutig machen , nicht die NameSpalte. Warum haben Sie der Spalte die eindeutige Einschränkung hinzugefügt Name? Wie kommt Ihnen das in Ihrem tepppTisch zugute ?
JP2-Code
1
Überhaupt keine Antwort auf das Q hier
Martin Smith