Автоинкрементный первичный ключ в SQL Server Management Studio 2012


448

Как я в таблице базы данных, я имел взгляд через форум , но не может видеть , как.auto incrementprimary keySQL Server

Я посмотрел свойства, но не вижу опции, я видел ответ, в котором вы переходите к Identityсвойству спецификации и устанавливаете его в значение да, а Identity incrementв 1 указываете значение, но этот раздел отображается серым цветом, и я не могу изменить нет да да

Должен быть простой способ сделать это, но я не могу его найти.


5
Является ли тип данных ключевого столбца int?
Рааб

1
@CoDe aDDict его текущее значение установлено как char (10), но я могу изменить его, просто тренируясь, спасибо
Ledgemonkey

Ответы:


704

Убедитесь, что в столбце «Ключ» указан тип данных, intа затем задайте идентичность вручную, как показано на рисунке.

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

Или просто запустите этот код

-- ID is the name of the  [to be] identity column
ALTER TABLE [yourTable] DROP COLUMN ID 
ALTER TABLE [yourTable] ADD ID INT IDENTITY(1,1)

код будет работать, если IDне единственный столбец в таблице

ссылка на изображение fifo's


21
Просто немного коррекции: IDENTITYсвойство может быть применено к любым числовым типам данных (так что это может быть tinyint, smallint, int, bigint, numeric, decimal), единственным ограничением является то , что он не может представлять дробное число (так что не может быть float или real, ни numericили decimal с ненулевой шкалой ) и ofc, спецификация идентичности должна быть совместима с выбранным типом данных.
Пред

2
Работа, при условии, что нет внешних ключей и т. Д.
Эндрю Дэй,

3
Я просто хотел добавить, что если вы уже установили значение по умолчанию для своего столбца идентификаторов, (Is Identity) остается серым. Удалите значение по умолчанию, и оно снова станет доступным.
CDspace

7
Если вы не можете изменить значения, перейдите в Tools-Options-Designers и снимите флажок «не сохранять изменения, которые требуют пересоздания».
Jaume

185

Когда вы создаете таблицу, вы можете создать IDENTITYстолбец следующим образом:

CREATE TABLE (
  ID_column INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
  ...
);

IDENTITYСвойство будет автоинкрементный столбец вверх из числа 1. (Обратите внимание , что тип данных столбца должен быть целым числом.) Если вы хотите добавить это к существующему колонку, используйте ALTER TABLEкоманду.

Редактировать:
немного протестировано, и я не могу найти способ изменить свойства Identity через окно Column Properties для различных таблиц. Я думаю, если вы хотите сделать столбец идентичным столбцом, вы должны использовать ALTER TABLEкоманду.


Ах, это специально для SQL Server 2008 r2 - не берите в голову.
Хосиен

2
Синтаксис создания таблиц - это хорошая практика, как советует автор этого поста в комментариях, надежда кому-то поможет.
Shaijut

88

Вы должны расширить раздел «Идентичность», чтобы раскрыть инкремент и начальное число.

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

Изменить: я предполагал, что у вас будет целочисленный тип данных, а не char (10). Какой разумный я бы сказал и действительный, когда я отправил этот ответ


2
Это yesсерое, как есть char(10)(из только что опубликованного комментария)
Martin Smith

@ Мартин Смит: да, похоже, это общая проблема, я собираюсь изменить это и проверить, большое спасибо
Ledgemonkey

при создании новой таблицы, которую я использовал, BookID int primary key identityя не указывал и начальное, и приращение, это хорошая практика? потому что я вижу документацию в MSDN. Если ничего не указано, по умолчанию используется значение (1,1).
Shaijut

40

Разверните свою базу данных, разверните таблицу, щелкните правой кнопкой мыши таблицу и выберите дизайн из выпадающего списка. Выглядит так

Теперь перейдите в свойства столбца под ним, прокрутите вниз и найдите Identity Specification , разверните ее, и вы увидите, Is Identity делает ее Да. Теперь выберите Идентификационный прирост прямо под ним и укажите значение, которое вы хотите увеличить . введите описание изображения здесь


1
мне кажется, это будет правильным ответом, просто сделать тип данных int не поможет, не так ли?
Дрюдин

10

Возможно, я что-то упускаю, но почему это не работает с объектом SEQUENCE? Разве это не то, что вы ищете?

Пример:

CREATE SCHEMA blah.
GO

CREATE SEQUENCE blah.blahsequence
START WITH 1
INCREMENT BY 1
NO CYCLE;

CREATE TABLE blah.de_blah_blah
(numbers bigint PRIMARY KEY NOT NULL
......etc

При ссылке на последовательность в скажем команду INSERT просто используйте:

NEXT VALUE FOR blah.blahsequence

Больше информации и опций для ПОСЛЕДОВАТЕЛЬНОСТИ


Это правильное решение, если вы заботитесь о временном порядке вставленных строк, потому что IDENTITYиногда скачки оставляют пропуски, тогда он снова заполняет эти пробелы. Так IDENTITYчто не гарантирует ВСЕГДА условие
incrmenet

1
@ Мартин Смит Ой, не пошли по ссылке, моя ошибка! Я так привык к тому, что в MS-SQL отсутствуют определенные функции, и иногда я забываю, что есть новые версии, которые поддерживают больше вещей. Я удалю свой комментарий, так как это может сбить с толку ... Если выразить это более общим, то оно остается в силе, хотя: возможно, он использует make / version в СУБД, которая не поддерживает объекты SEQUENCE - тем более, что вопрос задавался только через несколько месяцев после выхода SQL Server 2012;)
Пол

1
@FindOut_Quran Вы уверены, что пробелы в столбцах IDENTITY заполнены? Я работал только с SQL Server 2005, где я никогда не видел, чтобы это произошло - пробелы просто остаются. И я был бы довольно удивлен, увидев, что это происходит в любой СУБД, потому что такая функция будет странным сочетанием «несвободных» (с точки зрения производительности) и «нежелательных» (по крайней мере, в большинстве приложений).
Пол

@PaulGroke Да, я уверен. Вы можете попытаться использовать транзакцию для вставки 1000 строк, а затем выполнить откат. Значение идентичности будет зависать. Попробуйте вставить больше тысяч строк и зафиксировать / или выполнить откат. Вы заметите, что это иногда отступает, чтобы заполнить пробелы
FindOut_Quran

@FindOut_Quran Я не вижу, как это могло произойти. Столбцы MS SQL IDENTITY используют простой счетчик, который высевается в определяемое пользователем значение, а затем увеличивается на определяемое пользователем значение. Вы даже можете запросить и заново установить счетчик. Единственный способ, которым я могу видеть это, - это когда параллельные транзакции фиксируются «не в порядке». Т.е. транзакция, которая впервые столкнулась со счетчиком IDENTITY, фиксируется после другой транзакции. В этом случае у вас будет недолгая пропасть, которая затем будет заполнена. Что необходимо, чтобы избежать столкновений. Счетчик IDENTITY никогда не отскочит назад, хотя.
Пол

7

Когда вы используете тип данных: int, вы можете выбрать строку, которую хотите автоинкремментировать, и перейти к тегу свойств столбца. Там вы можете установить идентичность «да». Там же можно изменить начальное значение автоинкремента. Надеюсь, я мог помочь;)


где находятся свойства столбца?

2

У меня была эта проблема, когда я уже создал таблицу и не мог изменить ее, не удаляя таблицу, поэтому я сделал следующее: (Не уверен, когда они реализовали это, но имели это в SQL 2016)

Щелкните правой кнопкой мыши таблицу в проводнике объектов:

Script Table as > DROP And CREATE To > New Query Editor Window

Затем внесите изменения в сценарий, сказанный Жозьеном; прокрутите вниз, где CREATE TABLEнаходится, найдите свой первичный ключ и добавьте IDENTITY(1,1)в конце перед запятой. Запустить скрипт.

Сценарий DROP and CREATE также помог мне из-за этой проблемы. (Который обрабатывает сгенерированный скрипт.)


1

Будьте внимательны, если хотите, чтобы элементы идентификатора были условными или нет. В качестве SQLSERVER ID можно прыгать на 1000.

Пример: перед перезапуском ID = 11, после перезапуска вы вставляете новую строку в таблицу, тогда id будет 1012.


1

Вы можете использовать ключевое слово IDENTITYв качестве типа данных для столбца вместе с PRIMARY KEYограничением при создании таблицы.
например:

StudentNumber IDENTITY(1,1) PRIMARY KEY

Здесь первое «1» означает начальное значение, а второе «1» - возрастающее значение.


1
CREATE TABLE Persons (
    Personid int IDENTITY(1,1) PRIMARY KEY,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int
);

MS SQL Server использует ключевое слово IDENTITY для выполнения функции автоинкремента.

В приведенном выше примере начальное значение для IDENTITY равно 1, и оно будет увеличиваться на 1 для каждой новой записи.

Совет: чтобы указать, что столбец «Personid» должен начинаться со значения 10 и увеличиваться на 5, измените его на IDENTITY (10,5).

Чтобы вставить новую запись в таблицу «Персоны», нам НЕ нужно указывать значение для столбца «Персона» (уникальное значение будет добавлено автоматически):


0

Если таблица уже заполнена, невозможно изменить столбец на столбец IDENTITY или преобразовать его в столбец не IDENTITY. Вам нужно будет экспортировать все данные, затем вы можете изменить тип столбца на IDENTITY или наоборот, а затем импортировать данные обратно. Я знаю, что это болезненный процесс, но я считаю, что нет альтернативы, кроме как использовать последовательность, как указано в этом посте.


1
Вы можете использовать, ALTER TABLE ... SWITCHчтобы просто переключать метаданные, не касаясь данных вообще. Например, посмотрите, как установить автоинкремент после создания таблицы без потери данных?
Мартин Смит

1
Процесс, упомянутый в предоставленной вами ссылке, включает перенос данных во временную таблицу и обратно, что согласуется с моим утверждением выше. Если я ошибаюсь, приведите мне рабочий пример.
Softec

1
В ссылке есть рабочий пример. Там нет "передачи данных во временную таблицу и обратно". `ALTER TABLE ... SWITCH` - это изменение только метаданных. Он не перемещает никаких данных.
Мартин Смит
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.