SQL Server add auto increment primary key to existing table

Jako tytuł mam istniejącą tabelę, która jest już wypełniona 150000 rekordów. Dodałem kolumnę Id (która obecnie jest null).

Zakładam, że mogę uruchomić zapytanie, aby wypełnić tę kolumnę liczbami przyrostowymi, a następnie ustawić jako klucz podstawowy i włączyć automatyczną inkrementację. Czy to jest właściwy sposób postępowania? A jeśli tak, to jak wypełnić początkowe numery?

Author: marc_s, 2011-02-01

13 answers

Nie-musisz zrobić to na odwrót: dodaj go od razu jako INT IDENTITY - będzie wypełniony wartościami tożsamości, gdy to zrobisz:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY

I wtedy możesz zrobić z niego klucz główny:

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

Lub jeśli wolisz zrobić wszystko w jednym kroku:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY
       CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED
 344
Author: marc_s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-14 09:53:10

Nie można" włączyć " tożsamości: jest to tabela.

Jeśli nie zależy ci na kolejności liczb, dodasz kolumnę, a nie NULL, z tożsamością za jednym razem. 150 tysięcy rzędów to niewiele.

Jeśli chcesz zachować pewną kolejność liczb, dodaj odpowiednio liczby. Następnie użyj SSMS table designer, aby ustawić właściwość IDENTITY. To pozwala na wygenerowanie skryptu, który zrobi kolumny drop / add / keep numbers / reseed dla Ciebie.

 18
Author: gbn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-01 12:17:56

Miałem ten problem, ale nie mogłem użyć kolumny tożsamości (z różnych powodów). Zdecydowałem się na to:

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

Zapożyczone z tutaj .

 9
Author: Kevin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-20 17:38:21

Jeśli kolumna już istnieje w Twojej tabeli i ma wartość null, możesz zaktualizować kolumnę za pomocą tego polecenia (zamień id, nazwę tablename i tablekey):

UPDATE x
SET x.<Id> = x.New_Id
FROM (
  SELECT <Id>, ROW_NUMBER() OVER (ORDER BY <tablekey>) AS New_Id
  FROM <tablename>
  ) x
 3
Author: Renzo Ciot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-14 14:50:52

Gdy dodamy kolumnę and identity do istniejącej tabeli, automatycznie wypełni ona nie ma potrzeby wypełniania jej ręcznie.

 2
Author: user3279092,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-06 10:26:37

By the designer you could set identity (1,1) kliknij prawym przyciskiem myszy na tbl = > desing = > w części lewy (kliknij prawym przyciskiem myszy) = > Właściwości = > w kolumnach tożsamości wybierz #column

Właściwości

Kolumna Idendtity

 1
Author: gustavo herrera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-31 18:55:13

Oto pomysł, który możesz wypróbować. Oryginalna tabela-brak kolumny identity table1 Utwórz nową tabelę-wywołanie table2 wraz z kolumną identity. skopiuj dane z table1 do table2 - kolumna tożsamość jest wypełniana automatycznie przyrostem liczb.

Zmień nazwę oryginalnej tabeli-table1 na table3 Zmień nazwę nowej tabeli-table2 na table1 (oryginalna tabela) Teraz masz tabelę1 z kolumną tożsamość włączone i wypełnione dla istniejących danych. po upewnieniu się, że nie ma problem i działa prawidłowo, upuść tabelę3, gdy nie jest już potrzebna.

 0
Author: JH326,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-20 15:40:56

Utwórz nową tabelę z inną nazwą i tymi samymi kolumnami, kluczem głównym i kluczem obcym i połącz to w instrukcji Wstaw kod. Dla np.: dla pracownika, zastąp pracownikami.

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)   
) 

Musisz jednak usunąć istniejącą tabelę pracowników lub dostosować ją zgodnie z wymaganiami.

 0
Author: kumarP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-27 13:33:04

Jeśli twoja tabela ma związek z innymi tabelami za pomocą klucza głównego lub foriegen, może być niemożliwe, aby zmienić tabelę. więc musisz upuścić i utworzyć tabelę ponownie.
Aby rozwiązać te problemy należy wygenerować Skrypty przez kliknięcie prawym przyciskiem myszy na bazie danych i w opcji zaawansowanej ustawić typ danych do skryptu do schematu i danych. następnie użyj tego skryptu ze zmianą kolumny, aby zidentyfikować i zregenerować tabelę za pomocą Uruchom jej zapytanie.
Twoje zapytanie będzie jak tutaj:

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
Author: Hamid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-27 08:02:50

Ta odpowiedź jest małym dodatkiem do najwyżej głosowanej odpowiedzi i działa na SQL Server. Pytanie wymagało automatycznego przyrostu klucza podstawowego, bieżąca odpowiedź dodaje klucz podstawowy, ale nie jest oznaczona jako auto-przyrost. Poniższy skrypt sprawdza kolumny, istnienie i dodaje je z włączoną flagą autoincrement.

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
Author: John K.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-21 14:01:54

ALTER TABLE table_name ADD COLUMN ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT ; To może być przydatne

 -2
Author: Killer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-21 14:05:38

Spróbuj czegoś takiego (najpierw na stole testowym):

USE your_database_name
GO
WHILE (SELECT COUNT(*) FROM your_table WHERE your_id_field IS NULL) > 0
BEGIN
    SET ROWCOUNT 1
    UPDATE your_table SET your_id_field = MAX(your_id_field)+1
END
PRINT 'ALL DONE'
Nie testowałem tego w ogóle, więc bądź ostrożny!
 -3
Author: PacDemon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-01 12:22:57

To działa w MariaDB, więc mam nadzieję, że działa w SQL Server: upuść kolumnę ID, którą właśnie wstawiłeś, a następnie użyj następującej składni: -

ALTER TABLE table_name ADD id INT PRIMARY KEY AUTO_INCREMENT;

Nie ma potrzeby stosowania innej tabeli. To po prostu wstawia kolumnę id, czyni ją głównym indeksem i zapełnia ją wartościami sekwencyjnymi. Jeśli SQL Server tego nie zrobi, przepraszam za marnowanie twojego czasu.

 -3
Author: Road Warrior,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-26 16:33:10