Come creare una tabella con la colonna Identity


111

Ho una tabella esistente che sto per spazzare via perché non l'ho creata con la IDcolonna impostata come colonna Identità della tabella.

Utilizzando SQL Server Management Studio , ho creato uno script "Crea in ..." della tabella esistente e ho ottenuto questo:

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]

La mia domanda è: come lo modifico in SQLmodo che la mia tabella risultante abbia la IDcolonna impostata come Identità ?


11
[ID] [int] IDENTITÀ NOT NULLA (1,1)
Li0liQ

Risposte:


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]

1
Credo che fosse quello che stavo cercando. Non ho bisogno di modificare il PK_Historyvalore in IDo altro?
jp2code

No, questo dovrebbe essere tutto ciò di cui hai bisogno, PK_History è solo il nome del vincolo il vincolo della chiave primaria è già sull'ID colonna
Gratzy

1
qual è il significato dei parametri IDENTITY (1,1)
otc


33

Questo è già stato risposto, ma penso che la sintassi più semplice sia:

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

L'indice dei vincoli più complicato è utile quando si desidera effettivamente modificare le opzioni.

A proposito, preferisco nominare una colonna di questo tipo HistoryId, in modo che corrisponda ai nomi delle colonne nelle relazioni di chiave esterna.


5
OP sta lavorando specificamente con l'output di uno strumento GUI che emette il DDL per un oggetto esistente. Quello strumento probabilmente non ha un'opzione "usa una sintassi più semplice se possibile". Il meno soggetto a errori, per la situazione specifica di OP, sarebbe modificare l'unica riga nel DDL generato e non provare a scriverlo da zero utilizzando la sintassi più semplice. Inoltre, l'esempio che hai fornito non assegna un nome al vincolo PK come ha fatto OP. Molti preferiscono i miei vincoli denominati in modo che abbiano lo stesso nome in tutti gli ambienti (dev, test, prod). ID int constraint PK_History primary key identity(1,1)Credo.
Shannon Severance

3
Forse sì forse no. Sono stato in situazioni in cui ho preso lo script da un database, l'ho usato su un altro server e le impostazioni predefinite che funzionavano in un posto non erano le migliori per l'altro. In ogni caso, l'ho solo suggerito come soluzione poiché mi sembra più semplice (personalmente capisco la parola chiave "chiave primaria" molto meglio di quanto comprendo le opzioni su un vincolo e considero l'utilizzo di opzioni che non capisco come "cattive "). Tuttavia, fai una buona osservazione sul motivo per cui potrebbe essere preferita un'altra soluzione. Aggiungo che quella risposta è già quella accettata.
Gordon Linoff

@GordonLinoff: Mate, la chiave primaria per impostazione predefinita non è nulla, perché è necessario specificare esplicitamente non null qui?
Studente

@Learner. . . Entrambi i vincoli erano nel codice del PO. Il NOT NULLè ridondante.
Gordon Linoff

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

ovviamente, poiché stai creando la tabella in SQL Server Management Studio, puoi utilizzare la finestra di progettazione della tabella per impostare la specifica dell'identità.

inserisci qui la descrizione dell'immagine


1
Bene, grazie Phil. So come farlo, ma non posso perché il tavolo è già lì. Devo eliminare la tabella e ricrearla, ecco perché sto usando lo script.
jp2code

4
@ jp2code: volevo dire che avresti potuto creare una tabella di test con una colonna Identity e poi averla scritta come script per vedere come dovrebbe essere specificata.
Phil

-2

La chiave univoca consente max 2 valori NULL. spiegazione:

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

Se provi a inserire gli stessi valori di seguito:

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

Ogni volta che riceverai errori come:

Violazione del vincolo UNIQUE KEY "UQ__teppp__72E12F1B2E1BDC42". Impossibile inserire la chiave duplicata nell'oggetto "dbo.teppp".
La dichiarazione è stata terminata.


Avevo bisogno di rendere unica la IDcolonna , non la colonna. Perché hai aggiunto il vincolo univoco alla colonna? Come ti avvantaggia nella tua tavola? NameNameteppp
jp2code

1
Niente affatto una risposta alla Q qui
Martin Smith
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.