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


447

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

Я переглянув властивості, але не бачу опції, я побачив відповідь, куди ви переходите до Identityвластивості специфікації та встановлюєте її так і встановлюєте значення Identity increment1, але цей розділ є сірим кольором, і я не можу змінити ні "так".

Має бути простий спосіб зробити це, але я не можу його знайти.


5
Чи тип даних стовпця ключа є int?
Рааб

1
@CoDe aDDict свій поточний набір як char (10), але я можу змінити це, коли я просто практикую, дякую
Ledgemonkey

Відповіді:


704

Переконайтеся, що тип даних стовпця Key є, 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це не єдиний стовпець у таблиці

зображення посилання на фотографії


21
Просто трохи корекції: IDENTITYвластивість може бути застосоване до будь-яких числовим типами даних (так що це може бути tinyint, smallint, int, bigint, numeric, decimal), єдиним обмеженням є те , що він не може представляти дробове число (так що не може бути float або real, ні numericабо decimal з ненульовою шкалою ) та ofc, специфікація ідентичності повинна бути сумісною з обраним типом даних.
Pred

2
Робота, якщо немає закордонних ключів тощо
Ендрю День

3
Я просто хотів додати, якщо ви вже встановили значення за замовчуванням у своєму стовпчику особистих даних, (Is Identity) залишається затьмареним. Видаліть значення за замовчуванням, і воно знову стане доступним.
CDspace

7
Якщо ви не можете змінити значення, перейдіть до Інструментів-параметрів-конструкторів і зніміть прапорець "запобігти збереженню змін, які потребують повторного створення".
Jaume

185

Створюючи таблицю, ви можете створити IDENTITYстовпець наступним чином:

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

IDENTITYВластивість буде автоінкрементний стовпець вгору з числа 1. (Зверніть увагу , що тип даних стовпця повинен бути цілим числом.) Якщо ви хочете додати це до існуючого колонку, використовуйте ALTER TABLEкоманду.

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


Ах, це спеціально для SQL Server 2008 r2 - неважливо.
Йозієн

2
цей синтаксис створення таблиці є хорошою практикою, як радить автор цієї публікації в коментарях, сподіваюся, що хтось допоможе.
shaijut

88

Вам потрібно розгорнути розділ Ідентичність, щоб відкрити приріст та насіння.

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

Редагувати: Я припускав, що у вас буде цілий тип даних, а не char (10). Що розумно, я б сказав і дійсний, коли я опублікував цю відповідь


2
yesНеактивна , як це char(10)(від коментарів тільки відправив)
Martin Smith

@Martin Smith, так, здається, це загальне питання, я збираюся змінити це і перевірити, велике спасибі
Ledgemonkey

створюючи нову таблицю, яку я використав, BookID int primary key identityя не вказав і насіння, і приріст, це хороша практика? тому я бачу документацію в MSDN Якщо жодна з них не вказана, типовим є (1,1).
shaijut

40

Розгорніть свою базу даних, розгорніть таблицю правою кнопкою миші на таблиці та виберіть дизайн зі спадного меню. Це виглядає так

Тепер перейдіть до властивостей стовпця під ним, прокрутіть униз і знайдіть специфікацію особи , розгорніть її, і ви знайдете, чи Identity make it Так. Тепер виберіть Збільшення ідентичності праворуч під ним, надайте значення, яке ви хочете збільшити в ньому. введіть тут опис зображення


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

При посиланні на squence в команді INSERT просто використовуйте:

NEXT VALUE FOR blah.blahsequence

Більше інформації та варіанти для ПОСЛІДОВНОСТІ


Це рішення є правильним, якщо ви дбаєте про порядок часу вставлених рядків, адже IDENTITYіноді стрибає, залишаючи прогалини, то повертається, щоб знову заповнити ці прогалини. Тож IDENTITYне гарантує ВИНАГО вкладення умови
FindOut_Quran

1
@Martin Smith Oops, не перейшов за посиланням, моя помилка! Я так звик до MS-SQL, що не має певних функцій, що іноді забуваю, що є новіші версії, які підтримують більше матеріалів. Я видаляю свій коментар, оскільки він може бути заплутаним ... Якщо висловлюється більш загальним, він залишається дійсним, хоча: він може використовувати RDBMS make / версію, яка не підтримує SEQUENCE об'єкти - тим більше, що запитання було задано лише a через кілька місяців після виходу SQL Server 2012;)
Пол Грок

1
@FindOut_Quran Ви впевнені, що заповнені прогалини в стовпцях "IDENTITY"? Я працював лише з SQL Server 2005, де я ніколи не бачив, щоб це сталося - прогалини просто залишаються. І я був би дуже здивований, коли це трапляється на будь-яких RDBMS, оскільки така особливість була б дивним поєднанням "не безкоштовно" (для продуктивності) та "не бажано" (принаймні в більшості програм).
Пол Грок

@PaulGroke Так, я впевнений. Ви можете спробувати використовувати транзакцію для вставки 1000 рядків, а потім відкат. Цінність ідеетності збільшиться. Спробуйте вставити більше тисяч рядків і виконайте / або відкат. Ви помітите, що іноді спини заповнюють прогалини
FindOut_Quran

@FindOut_Quran Я не бачу, як це могло статися. У стовпцях MS SQL IDENTITY використовується простий лічильник, який висівається на визначене користувачем значення, а потім збільшується на значення, визначене користувачем. Можна навіть запитувати та встановлювати лічильник. Єдиний спосіб я бачу це, коли одночасні транзакції здійснюють "поза порядком". Тобто транзакція, яка вперше наштовхується на лічильник ідентичності, вчиняється після іншої транзакції. У такому випадку у вас виникне нетривалий розрив, який потім заповнюється. Що необхідно, щоб уникнути зіткнень. Лічильник ідентичності ніколи не відскочив назад.
Пол Грок

7

Якщо ви використовуєте Тип даних: int, ви можете вибрати рядок, який ви хочете отримати автоматично, і перейти до тегу властивостей стовпця. Там ви можете встановити особу на "так". Там же можна відредагувати початкове значення для автоматичного збільшення. Сподіваюся, я можу допомогти;)


де розташовані властивості стовпця?

2

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

Клацніть правою кнопкою миші на таблиці в Провіднику об’єктів:

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

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

Сценарій DROP і CREATE також був корисним для мене через цю проблему. (Який породжений сценарій обробляє.)


1

Будьте обережні, хочете, щоб елементи ID були контигіусами чи ні. Як ідентифікатор SQLSERVER може стрибнути на 1000.

Приклад: перед перезапуском ідентифікатора = 11 після перезавантаження ви вставляєте в таблицю новий рядок, тоді ідентифікатор буде 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 для кожного нового запису.

Порада. Щоб вказати, що стовпець «Персонід» повинен починатися зі значення 10 та збільшуватись на 5, змініть його на ІДЕНТИЧНІСТЬ (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.