Jak utworzyć tabelę z kolumną tożsamości


111

Mam istniejącą tabelę, którą zaraz zniszczę, ponieważ nie utworzyłem jej z IDkolumną ustawioną jako kolumna Tożsamość tabeli.

Używając SQL Server Management Studio , napisałem skrypt „Utwórz do ...” istniejącej tabeli i otrzymałem to:

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]

Moje pytanie brzmi, jak zmodyfikować to SQL, aby moja tabela wynikowa miała IDkolumnę ustawioną jako Tożsamość ?


11
[ID] [int] NOT NULL IDENTITY (1,1)
Li0liQ

Odpowiedzi:


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
Myślę, że właśnie tego szukałem. Nie muszę zmieniać PK_Historywartości na IDani nic?
jp2code

Nie, to wszystko, czego potrzebujesz, PK_History to tylko nazwa ograniczenia, które ograniczenie klucza podstawowego znajduje się już w kolumnie o identyfikatorze
Gratzy

1
jakie jest znaczenie parametrów IDENTITY (1,1)
otc

4
Tożsamość (ziarno, przyrost) docs.microsoft.com/en-us/sql/t-sql/statements/ ...
Gratzy

33

Na to już udzielono odpowiedzi, ale myślę, że najprostsza składnia to:

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

Bardziej skomplikowany indeks ograniczeń jest przydatny, gdy faktycznie chcesz zmienić opcje.

Nawiasem mówiąc, wolę nazwać taką kolumnę HistoryId, aby pasowała do nazw kolumn w relacjach klucza obcego.


5
OP pracuje w szczególności z danymi wyjściowymi narzędzia GUI, które generuje kod DDL dla istniejącego obiektu. To narzędzie prawdopodobnie nie ma opcji „użyj prostszej składni, jeśli to możliwe”. Najmniej podatnym na błędy w konkretnej sytuacji OP byłaby edycja jednego wiersza w wygenerowanym DDL, a nie próba zapisania go od zera przy użyciu najprostszej składni. Również podany przez ciebie przykład nie przypisuje nazwy ograniczeniu PK, tak jak OP. Wiele osób woli moje ograniczenia nazwane tak, aby miały tę samą nazwę we wszystkich środowiskach (dev, test, prod). ID int constraint PK_History primary key identity(1,1)Wierzę.
Shannon Severance

3
Może, może nie. Byłem w sytuacjach, w których wziąłem skrypt z jednej bazy danych, użyłem go na innym serwerze, a ustawienia domyślne, które działały w jednym miejscu, nie były najlepsze dla drugiego. W każdym razie zasugerowałem tylko to jako rozwiązanie, ponieważ wydaje mi się to prostsze (osobiście rozumiem słowo kluczowe „klucz podstawowy” znacznie lepiej niż opcje ograniczenia i rozważam użycie opcji, których nie rozumiem jako „złych ”). Jednak dobrze wyjaśnisz, dlaczego inne rozwiązanie może być preferowane. Powinienem dodać, że ta odpowiedź jest już zaakceptowaną odpowiedzią.
Gordon Linoff

@GordonLinoff: Mate, klucz podstawowy domyślnie nie ma wartości null, dlaczego musisz wyraźnie określić tutaj wartość not null?
Learner

@Learner. . . Oba ograniczenia były w kodzie PO. NOT NULLJest zbędny.
Gordon Linoff

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

oczywiście, ponieważ tworzysz tabelę w SQL Server Management Studio, możesz użyć projektanta tabel do ustawienia Specyfikacji tożsamości.

wprowadź opis obrazu tutaj


1
Cóż, dzięki Phil. Wiem, jak to zrobić, ale nie mogę, bo stół już tam jest. Muszę usunąć tabelę i odtworzyć ją, dlatego używam skryptu.
jp2code

4
@ jp2code: Miałem na myśli to, że mogłeś utworzyć tabelę testową z kolumną Identity, a następnie napisać skrypt, aby zobaczyć, jak należy ją określić.
Phil

-2

Unikalny klucz pozwala na maksymalnie 2 wartości NULL. Wyjaśnienie:

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

Jeśli spróbujesz wstawić te same wartości, co poniżej:

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

Za każdym razem, gdy pojawi się błąd, taki jak:

Naruszenie ograniczenia UNIQUE KEY „UQ__teppp__72E12F1B2E1BDC42”. Nie można wstawić zduplikowanego klucza do obiektu „dbo.teppp”.
Oświadczenie zostało zakończone.


Musiałem uczynić IDkolumnę wyjątkową , a nie Namekolumną. Dlaczego dodałeś unikalne ograniczenie do Namekolumny? Jakie korzyści daje ci to przy tepppstole?
jp2code

1
Wcale nie odpowiedź na Q tutaj
Martin Smith
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.