2012-05-23 20 views
80

Ich habe eine vorhandene Tabelle, die ich wegblasen werde, weil ich sie nicht mit der Spalte ID erstellt habe, die als Identitätsspalte der Tabelle festgelegt wurde.Erstellen einer Tabelle mit Identitätsspalte

Verwenden von SQL Server Management Studio, ich scripted ein Erstellen ... der bestehenden Tabelle und bekam dies:

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 kann ich das SQL ändern, so dass meine resultierende Tabelle hat die ID Spalte als Identität?

+11

[ID] [int] NICHT NULL IDENTITÄT (1,1) – Li0liQ

Antwort

114
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] 
+0

Ich glaube, das ist, was ich gesucht habe. Ich muss den "PK_History" Wert zu "ID" oder irgendetwas nicht ändern? – jp2code

+0

Nein, das sollte alles sein, was Sie brauchen, PK_History ist nur der Name der Einschränkung die Primärschlüssel-Einschränkung ist für die Spalte ID bereits – Gratzy

+0

was ist die Bedeutung der Parameter IDENTITY (1,1) – otc

9
[id] [int] IDENTITY(1,1) NOT NULL, 

natürlich, da Sie die Tabelle in SQL Server Management Studio erstellen, können Sie den Tabellen-Designer verwenden, um die Identity Specification festzulegen.

enter image description here

+1

Nun, danke Phil. Ich weiß, wie man das macht, aber ich kann nicht, weil der Tisch schon da ist. Ich muss die Tabelle löschen und neu erstellen, weshalb ich das Skript verwende. – jp2code

+4

@ jp2code: Ich meinte, dass Sie eine Testtabelle mit einer Identity-Spalte erstellt haben könnten und dann skripted, um zu sehen, wie sie spezifiziert werden sollte. – Phil

29

hat dies bereits beantwortet worden, aber ich denke, die einfachste Syntax:

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

Je komplizierter Zwangsindex nützlich ist, wenn Sie tatsächlich die Optionen ändern möchten.

Übrigens bevorzuge ich eine solche Spalte HistoryId, so dass es die Namen der Spalten in Fremdschlüsselbeziehungen entspricht.

+4

OP arbeitet speziell mit der Ausgabe eines GUI-Tools, das die DDL für ein existierendes ausgibt Objekt. Dieses Werkzeug hat wahrscheinlich keine Option "verwende einfachere Syntax, wenn möglich". Am wenigsten anfällig für die spezielle Situation von OP wäre es, die eine Zeile in der generierten DDL zu bearbeiten und nicht zu versuchen, sie von Grund auf mit der einfachsten Syntax zu schreiben. Auch das Beispiel, das Sie angegeben haben, weist der PK-Bedingung keinen Namen zu, wie OP es hat.Viele bevorzugen meine Constraints, so dass sie in allen Umgebungen denselben Namen haben (dev, test, prod). 'ID int Einschränkung PK_History Primärschlüssel Identität (1,1)' Ich glaube. –

+3

Vielleicht, vielleicht nicht. Ich war in Situationen, in denen ich das Skript aus einer Datenbank genommen, es auf einem anderen Server verwendet habe und die Standardeinstellungen, die an einem Ort funktionierten, nicht optimal für den anderen waren. In jedem 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 einer Einschränkung verstehe und Optionen, die ich nicht verstehe, als "schlecht" betrachte "). 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. –

-2

Eindeutiger Schlüssel erlaubt maximal 2 NULL Werte. Explaination:

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, wie unten gleiche Werte einfügen:

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

Jedesmal, wenn Sie Fehler wie bekommen:

Verletzung der UNIQUE KEY-Einschränkung 'UQ__teppp__72E12F1B2E1BDC42'. Kann keinen doppelten Schlüssel in Objekt 'dbo.teppp' einfügen.
Die Anweisung wurde beendet.

+0

Ich musste die Spalte 'ID' ** eindeutig ** machen, nicht die Spalte 'Name'. Warum haben Sie die Einschränkung ** unique ** zur Spalte 'Name' hinzugefügt? Was nützt Ihnen das in Ihrer 'teppp' Tabelle? – jp2code

+0

Keine Antwort auf das Q hier –

Verwandte Themen