SQL Server додає первинний ключ автоматичного збільшення до існуючої таблиці


253

Як заголовок, у мене є існуюча таблиця, яка вже заповнена 150000 записами. Я додав стовпчик Id (який наразі є нульовим).

Я припускаю, що я можу запустити запит, щоб заповнити цей стовпець додатковими номерами, а потім встановити в якості основного ключа та увімкнути автоматичне збільшення. Це правильний спосіб продовження? І якщо так, то як я заповнюю початкові цифри?

Відповіді:


429

Ні - ви повинні робити це навпаки: додайте його прямо з get go як INT IDENTITY- воно буде заповнене значеннями ідентичності, коли ви це зробите:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY

і тоді ви можете зробити його первинним ключем:

ALTER TABLE dbo.YourTable
   ADD CONSTRAINT PK_YourTable
   PRIMARY KEY(ID)

або якщо ви віддаєте перевагу робити все за один крок:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY
       CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED

2
Це дійсно гарна відповідь, але як я можу змінити початкове ціле число з 1 на 1000? Я хотів би почати рахувати з 1000. Я підозрюю, що можу використовувати, ALTER TABLE ORDER ALTER COLUMN ORDERNO RESTART WITH 1але я не хотів спробувати це, не перевірившись з експертом :) Ref. pic.dhe.ibm.com/infocenter/iseries/v7r1m0/…
користувач1477388

3
Я просто використав це, і, здається, працювавalter table attachments add ATTACHMENT_NUMBER int identity (1000, 1)
user1477388

1
@stom: якщо ви нічого не вказуєте, буде використано seed = 1 та приріст = 1 - що є найбільш часто використовуваним налаштуванням у будь-якому випадку. Якщо ви створили таку таблицю - вона буде працювати чудово. Але я б рекомендував завжди чітко вказувати насіння та приріст у своїх SQL-скриптах, особливо для більшого сайту. Це просто хороша практика.
marc_s

1
@stom: ну, PRIMARY KEYмається на увазі, що NOT NULLє на місці - так знову ж таки - це зовсім не потрібно. Але я вважаю за краще бути явним, і тому я завжди маю NOT NULLтам, щоб бути абсолютно зрозумілим
marc_s

3
@ turbo88: коли ви визначаєте свій PRIMARY KEY, кластерний індекс створюється автоматично для вас (якщо ви чітко не вказуєте NONCLUSTERED)
marc_s

19

Ви не можете "увімкнути" ідентичність: це перебудова таблиці.

Якщо ви не переймаєтесь порядком з номером, ви додасте стовпець, а не NULL, з ідентифікацією за один раз. 150k рядків - це не багато.

Якщо вам потрібно зберегти деякий порядок числення, то додайте цифри відповідно. Потім використовуйте конструктор таблиць SSMS, щоб встановити властивість IDENTITY. Це дозволяє генерувати скрипт, який зробить для вас крапку / додавання / збереження чисел / повторне повторення.


5
ОП працює на SQL Server 2008, тому є спосіб
Мартін Сміт

Весь екземпляр потрібно запустити в режимі одного користувача, так що, ймовірно, не життєздатний для більшості обставин, але ALTER TABLE ... SWITCHможе обійтися без цього.
Мартін Сміт

11

У мене виникла ця проблема, але не вдалося використати стовпець посвідчення (з різних причин). Я зупинився на цьому:

DECLARE @id INT
SET @id = 0 
UPDATE table SET @id = id = @id + 1 

Позичені звідси .


4

Якщо стовпець вже існує у вашій таблиці, і він є нульовим, ви можете оновити стовпець за допомогою цієї команди (замінити ідентифікатор, ім'я та таблицю ключів):

UPDATE x
SET x.<Id> = x.New_Id
FROM (
  SELECT <Id>, ROW_NUMBER() OVER (ORDER BY <tablekey>) AS New_Id
  FROM <tablename>
  ) x

Ви заощадили мені час із цим! Гарне доповнення до відповіді @ gbn.
Крістен Уейт

2

Коли ми додамо стовпець та ідентичність у існуючу таблицю, вона автоматично заповнюватиметься, не потрібно заповнювати її вручну.


2

дизайнером ви можете встановити особистість (1,1) клацанням правою кнопкою миші на tbl => desing => в частині ліворуч (клацання правою кнопкою миші => властивості => у стовпцях особи виберіть # Column

Властивості

стовпчик ідейності


1
Чи є у вас інформація про те, чи це хороший підхід? ОП запитує, чи це "правильний шлях". Більш повна відповідь могла б допомогти їм знати плюси та мінуси підходу.
jinglesthula

Дійсно, я використовую цю опцію в середовищі розробки, якщо ви перенесите цю зміну у виробництво, вам слід подати висновок з VIEW DEPENDENCY, якщо поле ідентичності використовується деякою процедурою Store або тригером.
gustavo herrera

2

Якщо ваша таблиця має зв'язок з іншими таблицями, використовуючи її первинний ключ або ключ foriegen, можливо, змінити вашу таблицю неможливо. тому вам потрібно кинути і створити таблицю знову.
Для вирішення цих проблем вам потрібно створити сценарії, клацнувши правою кнопкою миші на базі даних, а в розширеному варіанті встановіть тип даних для сценарію для схеми та даних. після цього, використовуючи цей скрипт зі зміною стовпця, щоб ідентифікувати та регенерувати таблицю за допомогою запуску її запиту.
ваш запит буде таким:

USE [Db_YourDbName]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Drop TABLE [dbo].[Tbl_TourTable]

CREATE TABLE [dbo].[Tbl_TourTable](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
    [Family] [nvarchar](150) NULL)  

GO

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] ON 

INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] off 

0

Ось ідея, яку можна спробувати. Оригінальна таблиця - стовпчик ідентичності table1 не створює нову таблицю - таблицю викликів2 разом із стовпцем ідентичності. скопіюйте дані з таблиці1 в таблицю2 - стовпець ідентичності заповнюється автоматично з автоматично збільшеними номерами.

перейменуйте оригінальну таблицю - table1 до table3 перейменуйте нову таблицю - table2 в table1 (оригінальна таблиця) Тепер у вас є таблиця1 із стовпцем ідентичності, включеним для наявних даних. після того, як переконаєтесь у тому, що немає жодної проблеми та працює належним чином, киньте таблицю3, коли вона більше не потрібна.


0

Створіть нову таблицю з різними іменами та однаковими стовпцями, асоціацією первинного ключа та зовнішнім ключем та зв’яжіть це у своєму вкладенні заяви коду. Напр .: Для працівників, замініть на РОБОТОДАВЦІВ.

CREATE TABLE EMPLOYEES(

    EmpId        INT NOT NULL IDENTITY(1,1), 
    F_Name       VARCHAR(20) ,
    L_Name       VARCHAR(20) ,
    DOB          DATE ,
    DOJ          DATE ,
    PRIMARY KEY (EmpId),
    DeptId int FOREIGN KEY REFERENCES DEPARTMENT(DeptId),
    DesgId int FOREIGN KEY REFERENCES DESIGNATION(DesgId),
    AddId int FOREIGN KEY REFERENCES ADDRESS(AddId)   
) 

Однак вам доведеться або видалити існуючу таблицю ПРАЦІВНИКА, або зробити деяке коригування відповідно до вашої вимоги.


0

Ця відповідь є невеликим доповненням до найвищої відповіді та працює для SQL Server. Питання вимагає автоматичного збільшення первинного ключа, поточна відповідь додає первинний ключ, але він не позначений як автоматичне збільшення. Сценарій нижче перевіряє наявність стовпців та існування та додає їх із увімкненим прапором автоматичного збільшення.

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTable' AND COLUMN_NAME = 'PKColumnName')
BEGIN


ALTER TABLE dbo.YourTable
   ADD PKColumnName INT IDENTITY(1,1)

CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED

END

GO

0
ALTER TABLE table_name ADD temp_col INT IDENTITY(1,1) 
update 

5
ви можете пояснити це?
Мухаммад Діяс Яскур

1
Хоча цей код може вирішити проблему ОП, найкраще включити пояснення, як ваш код вирішує проблему ОП. Таким чином майбутні відвідувачі можуть дізнатисясь із вашої публікації та застосувати її до власного коду. ТАК - це не програма кодування, а ресурс для знань. Крім того, швидше за все буде сприйнято високу якість, повні відповіді. Ці функції, поряд з вимогою, що всі повідомлення є автономними, є деякою сильною стороною SO як платформи, що відрізняє її від форумів. Ви можете редагувати, щоб додати додаткову інформацію та / або доповнити свої пояснення джерельною документацією.
ysf

-1

змінити таблицю / ** вставити ім'я табалу ** / додати ідентифікатор ідентифікатор identity (1,1)

видалити з / ** вставити ім'я табалу ** /, де id

(

виберіть a.id ВІД / ** вставте ім'я табалу / як ЛІВНІЙ ВНУТРІШНІЙ ПРИЄДНАЙТЕСЬ (ВИБІР МІН (id) як id ВІД / вставте ім'я табалу / GROUP BY / вставте стовпці c1, c2 .... ** /

) as t1 
ON a.id = t1.id

ДЕ t1.id НУЛЬНИЙ

)

змінити таблицю / ** вставити ім'я табалу ** / DROP COLUMN id


Яке ваше запитання? Як спитати
Енн Кілзер

1
Відредагуйте свою відповідь, використовуючи розмітку, щоб правильно форматувати приклад коду.
Білл Келлер

-3

Спробуйте щось подібне (спочатку на тестовій таблиці):

ВИКОРИСТУЙТЕ своє ім'я_дані_бази
ПОВЕРНУТИСЯ
WHILE (ВИБІРТЕ КУХНУ (*) ВІД свого_табеля, де ваше_id_field NULL)> 0
ПОЧАТОК
    Встановити ЗНИЖКУ 1
    ОНОВЛЮЙТЕ ваш_табель SET your_id_field = MAX (your_id_field) +1
Кінець
ПЕЧАТЬ "ВСЕ Зроблено"

Я взагалі цього не перевіряв, тому будьте обережні!


1
-1 Не відповідає на питання (що стосується додавання IDENTITYстовпців) і не працює. UPDATE your_table SET your_id_field = MAX(your_id_field)+1ти не можеш просто затиснутись MAXтам. Де WHEREпункт про уникнення неодноразового оновлення одного і того ж рядка?
Мартін Сміт

-3

Це працює в MariaDB, тому я можу лише сподіватися, що це робиться в SQL Server: опустіть стовпець ідентифікатора, який ви тільки що вставили, і використовуйте наступний синтаксис: -

ALTER TABLE table_name ADD id INT PRIMARY KEY AUTO_INCREMENT;

Не потрібно іншого столу. Це просто вставляє стовпчик id, робить його основним індексом і заповнює його послідовними значеннями. Якщо SQL Server цього не зробить, вибачте, що витрачаєте час.


-3

ALTER TABLE table_name ADD COLUMN ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT; Це може бути корисним

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.