Как создать таблицу со столбцом идентификаторов


111

У меня есть существующая таблица, которую я собираюсь уничтожить, потому что я не создавал ее с IDнабором столбцов в качестве столбца Identity таблицы.

Используя SQL Server Management Studio , я написал сценарий «Создать в ...» существующей таблицы и получил следующее:

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]

Мой вопрос: как мне изменить это, SQLчтобы в моей результирующей таблице IDстолбец был установлен как Identity ?


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

Ответы:


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
Я считаю, что это то, что я искал. Мне не нужно менять PK_Historyзначение на IDчто-нибудь?
jp2code

Нет, это должно быть все, что вам нужно, PK_History - это просто имя ограничения, ограничение первичного ключа уже есть в идентификаторе столбца
Gratzy

1
что означают параметры IDENTITY (1,1)
otc

4
Идентификация (начальное число, приращение) docs.microsoft.com/en-us/sql/t-sql/statements/…
Gratzy

33

На это уже был дан ответ, но я думаю, что самый простой синтаксис:

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

Более сложный индекс ограничения полезен, когда вы действительно хотите изменить параметры.

Кстати, я предпочитаю называть такой столбец HistoryId, чтобы он соответствовал именам столбцов во взаимосвязях внешнего ключа.


5
OP специально работает с выводом инструмента GUI, который выводит DDL для существующего объекта. У этого инструмента, вероятно, нет опции «использовать, если возможно, более простой синтаксис». Наименее подверженным ошибкам для конкретной ситуации OP было бы редактировать одну строку в сгенерированном DDL, а не пытаться написать ее с нуля, используя простейший синтаксис. Также приведенный вами пример не назначает имя ограничению PK, как у OP. Многие предпочитают, чтобы мои ограничения назывались одинаково во всех средах (dev, test, prod). ID int constraint PK_History primary key identity(1,1)Я считаю.
Шеннон Северанс

3
Может быть, а может и нет. Я бывал в ситуациях, когда я брал сценарий из одной базы данных, использовал его на другом сервере, а настройки по умолчанию, которые работали в одном месте, не подходили для другого. В любом случае, я предложил это только как решение, так как оно кажется мне более простым (я лично понимаю ключевое слово «первичный ключ» намного лучше, чем я понимаю параметры ограничения, и я рассматриваю варианты, которые я не понимаю, как «плохие» "). Однако вы хорошо понимаете, почему может быть предпочтительнее другое решение. Я должен добавить, что этот ответ уже принят.
Гордон Линофф

@GordonLinoff: Mate, первичный ключ по умолчанию не равен нулю, почему вам нужно явно указать здесь not null?
Учащийся

@ Ученик. . . Оба ограничения были в коде OP. Это NOT NULLизбыточно.
Гордон Линофф

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

конечно, поскольку вы создаете таблицу в SQL Server Management Studio, вы можете использовать конструктор таблиц для установки спецификации идентификации.

введите описание изображения здесь


1
Спасибо, Фил. Я знаю, как это сделать, но не могу, потому что стол уже есть. Мне нужно удалить таблицу и воссоздать ее, поэтому я использую сценарий.
jp2code

4
@ jp2code: я имел в виду, что вы могли бы создать тестовую таблицу со столбцом Identity, а затем написать сценарий, чтобы увидеть, как это должно быть указано.
Фил

-2

Уникальный ключ допускает максимум 2 значения NULL. Объяснение:

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

Если вы попробуете вставить те же значения, что и ниже:

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

Каждый раз вы будете получать такую ​​ошибку:

Нарушение ограничения UNIQUE KEY 'UQ__teppp__72E12F1B2E1BDC42'. Невозможно вставить повторяющийся ключ в объект 'dbo.teppp'.
Заявление было прекращено.


Мне нужно было сделать уникальнымID столбец , а не столбец. Почему вы добавили уникальное ограничение в столбец? Какую пользу это принесет вам в вашем столе? NameNameteppp
jp2code

1
Совсем не ответ на вопрос здесь
Мартин Смит
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.