Como criar uma tabela com coluna de identidade

111

Eu tenho uma tabela existente que estou prestes a explodir porque não a criei com a IDcoluna definida para ser a coluna Identidade da tabela.

Usando o SQL Server Management Studio , criei um script "Criar para ..." da tabela existente e obtive isto:

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]

Minha pergunta é: como eu modificaria isso SQLpara que minha tabela resultante tenha a IDcoluna definida como a identidade ?

jp2code
fonte
11
[ID] [int] IDENTIDADE NOT NULL (1,1)
Li0liQ

Respostas:

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
fonte
1
Eu acredito que é isso que eu estava procurando. Não preciso alterar o PK_Historyvalor para IDou algo assim?
jp2code
Não, isso deve ser tudo que você precisa, PK_History é apenas o nome da restrição que a restrição de chave primária já está no ID da coluna
Gratzy
1
qual é o significado dos parâmetros IDENTITY (1,1)
otc
4
Identidade (semente, incremento) docs.microsoft.com/en-us/sql/t-sql/statements/…
Gratzy
33

Isso já foi respondido, mas acho que a sintaxe mais simples é:

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

O índice de restrição mais complicado é útil quando você realmente deseja alterar as opções.

A propósito, prefiro nomear essa coluna como HistoryId, para que corresponda aos nomes das colunas em relacionamentos de chave estrangeira.

Gordon Linoff
fonte
5
O OP está trabalhando especificamente com a saída de uma ferramenta GUI que gera a DDL para um objeto existente. Essa ferramenta provavelmente não tem uma opção "usar sintaxe mais simples se possível". O menos sujeito a erros, para a situação específica do OP, seria editar uma linha no DDL gerado e não tentar escrevê-lo do zero usando a sintaxe mais simples. Além disso, o exemplo que você deu não atribui um nome à restrição de PK como OP tem. Muitos preferem minhas restrições nomeadas para que tenham o mesmo nome em todos os ambientes (dev, test, prod). ID int constraint PK_History primary key identity(1,1)Acredito.
Shannon Severance
3
Talvez talvez não. Já estive em situações em que peguei o script de um banco de dados, usei em outro servidor e os padrões que funcionavam em um lugar não eram os melhores para o outro. Em qualquer caso, só sugeri isso como uma solução, pois parece mais simples para mim (eu pessoalmente entendo a palavra-chave "chave primária" muito melhor do que entendo as opções de uma restrição e considero usar opções que não entendo como "ruins "). No entanto, você esclarece por que outra solução pode ser preferida. Devo acrescentar que essa resposta já é a resposta aceita.
Gordon Linoff
@GordonLinoff: Mate, a chave primária é, por padrão, não nula, por que você precisa especificar explicitamente não nula aqui?
Aprendiz de
@Learner. . . Ambas as restrições estavam no código do OP. O NOT NULLé redundante.
Gordon Linoff
12
[id] [int] IDENTITY(1,1) NOT NULL,

é claro, já que você está criando a tabela no SQL Server Management Studio, você pode usar o designer de tabela para definir a especificação de identidade.

insira a descrição da imagem aqui

Phil
fonte
1
Bem, obrigado Phil. Eu sei fazer isso, mas não posso porque a mesa já está lá. Tenho que excluir a tabela e recriá-la, por isso estou usando o script.
jp2code
4
@ jp2code: Eu quis dizer que você poderia ter criado uma tabela de teste com uma coluna de identidade e então fazer um script para ver como ela deveria ser especificada.
Phil
-2

A chave única permite no máximo 2 valores NULL. Explicação:

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 você tentar inserir os mesmos valores abaixo:

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

Sempre que você obterá erros como:

Violação da restrição UNIQUE KEY 'UQ__teppp__72E12F1B2E1BDC42'. Não é possível inserir uma chave duplicada no objeto 'dbo.teppp'.
A instrução foi encerrada.

Priyanka
fonte
Eu precisava tornar a IDcoluna única , não a Namecoluna. Por que você adicionou a restrição exclusiva à Namecoluna? Como isso te beneficia em sua tepppmesa?
jp2code
1
Não é uma resposta ao Q aqui
Martin Smith