SQL Server dodaje klucz podstawowy automatycznego przyrostu do istniejącej tabeli


253

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

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

Odpowiedzi:


429

Nie - musisz to zrobić odwrotnie: dodaj go od samego początku, ponieważ INT IDENTITY- zostanie to wypełnione wartościami tożsamości, gdy to zrobisz:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY

a następnie możesz ustawić go jako klucz podstawowy:

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

lub jeśli wolisz robić wszystko w jednym kroku:

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

2
To naprawdę dobra odpowiedź, ale jak mogę zmienić początkową liczbę całkowitą z 1 na 1000? Chciałbym zacząć liczyć od 1000. Podejrzewam, że mogę użyć, ALTER TABLE ORDER ALTER COLUMN ORDERNO RESTART WITH 1ale nie chciałem tego próbować bez konsultacji z ekspertem :) Ref. pic.dhe.ibm.com/infocenter/iseries/v7r1m0/…
user1477388

3
Właśnie tego użyłem i wydaje się, że zadziałałoalter table attachments add ATTACHMENT_NUMBER int identity (1000, 1)
1477388

1
@stom: jeśli nic nie określisz, zostanie użyte seed = 1 i increment = 1 - co i tak jest najczęściej używanym ustawieniem. Jeśli utworzyłeś taki stół - będzie działał dobrze. Ale zalecałbym zawsze jawnie określać ziarno i przyrost w skryptach SQL - szczególnie w przypadku większej witryny. To tylko dobra praktyka.
marc_s

1
@stom: cóż, PRIMARY KEYimplikacje, które NOT NULLsą na miejscu - więc znowu - nie jest to absolutnie konieczne. Ale wolę być wyraźny i dlatego zawsze mam to NOT NULL, żeby być absolutnie jasnym
marc_s

3
@ turbo88: gdy zdefiniujesz swój PRIMARY KEY, indeks klastrowany jest tworzony automatycznie (chyba że wyraźnie to określisz NONCLUSTERED)
marc_s

19

Nie można „włączyć” TOŻSAMOŚCI: jest to przebudowa stołu.

Jeśli nie zależy ci na kolejności numerów, dodajesz kolumnę, NIE NULL, z TOŻSAMOŚCIĄ za jednym razem. 150 tys. Rzędów to niewiele.

Jeśli chcesz zachować pewną kolejność numerów, dodaj odpowiednio liczby. Następnie użyj projektanta tabel SSMS, aby ustawić właściwość TOŻSAMOŚĆ. Umożliwia to wygenerowanie skryptu, który wykona dla ciebie kolumnę upuszczania / dodawania / przechowywania numerów / ponownego wybierania.


5
OP działa na SQL Server 2008, więc istnieje sposób
Martin Smith

Całą instancję należy uruchomić w trybie pojedynczego użytkownika, więc prawdopodobnie nie jest to wykonalne w większości przypadków, ale ALTER TABLE ... SWITCHmożna to zrobić bez tego.
Martin Smith

11

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 

Pożyczony stąd .


4

Jeśli kolumna już istnieje w tabeli i ma wartość NULL, możesz zaktualizować kolumnę za pomocą tego polecenia (zamień identyfikator, 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

Zaoszczędziłeś mi z tym czas! Dobry dodatek do odpowiedzi @ gbn.
Kristen Waite

2

Kiedy dodamy kolumnę tożsamości i w istniejącej tabeli, zostanie ona automatycznie wypełniona bez potrzeby wypełniania jej ręcznie.


2

przez projektanta możesz ustawić tożsamość (1,1) kliknij prawym przyciskiem myszy tbl => desing => częściowo w lewo (prawy przycisk myszy) => właściwości => w kolumnach tożsamości wybierz #kolumnę

Nieruchomości

kolumna osobowości


1
Czy masz informacje na temat tego, czy jest to dobre podejście? OP pyta, czy jest to „właściwy sposób postępowania”. Pełniejsza odpowiedź może pomóc im poznać zalety / wady tego podejścia.
jinglesthula

Naprawdę używam tej opcji w środowisku programistycznym, jeśli przekażesz tę zmianę do produkcji, powinieneś zweryfikować ZOBACZ ZALEŻNOŚĆ, jeśli pole tożsamości jest używane przez jakąś procedurę Store lub wyzwalacz.
gustavo herrera

2

Jeśli twoja tabela ma związek z innymi tabelami za pomocą klucza podstawowego lub klucza foriegen, może nie być możliwe zmodyfikowanie tabeli. więc musisz upuścić i ponownie utworzyć tabelę.
Aby rozwiązać te problemy, musisz wygenerować skrypty, klikając prawym przyciskiem myszy bazę danych, aw opcji zaawansowanej ustaw typ danych do skryptu na schemat i dane. następnie za pomocą tego skryptu wraz ze zmianą kolumny w celu zidentyfikowania i ponownego wygenerowania tabeli za pomocą jej zapytania
Twoje zapytanie będzie takie 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

Oto pomysł, który możesz wypróbować. Oryginalna tabela - brak kolumny tabeli tożsamości 1 utwórz nową tabelę - wywołaj tabelę 2 wraz z kolumną tożsamości. skopiuj dane z tabeli 1 do tabeli 2 - kolumna tożsamości jest zapełniana automatycznie numerami automatycznie zwiększanymi.

zmień nazwę oryginalnej tabeli - table1 na table3 zmień nazwę nowej tabeli - table2 na table1 (oryginalna tabela) Teraz masz table1 z kolumną tożsamości dołączoną i wypełnioną dla istniejących danych. po upewnieniu się, że nie ma problemu i działa poprawnie, upuść tabelę3, gdy nie będzie już potrzebna.


0

Utwórz nową tabelę z inną nazwą i tymi samymi kolumnami, powiązaniem klucza głównego i klucza obcego i połącz to w instrukcji wstawiania kodu. Na przykład: W przypadku PRACOWNIKA należy zastąpić PRACOWNIKA.

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ę PRACOWNIKA lub dokonać pewnych dostosowań zgodnie ze swoimi wymaganiami.


0

Ta odpowiedź jest niewielkim dodatkiem do najwyżej głosowanej odpowiedzi i działa w przypadku programu SQL Server. Pytanie wymagało klucza podstawowego automatycznego przyrostu, aktualna odpowiedź dodaje klucz podstawowy, ale nie jest oznaczane jako automatyczne zwiększenie. Poniższy skrypt sprawdza kolumny, istnienie i dodaje je z włączoną flagą autoinkrementacji.

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
możesz to wyjaśnić?
Muhammad Dyas Yaskur

1
Chociaż ten kod może rozwiązać problem PO, najlepiej dołączyć wyjaśnienie, w jaki sposób Twój kod rozwiązuje problem PO. W ten sposób przyszli użytkownicy mogą uczyć się z Twojego postu i stosować go do własnego kodu. SO nie jest usługą kodowania, ale zasobem wiedzy. Ponadto, wysokiej jakości, pełne odpowiedzi będą częściej oceniane. Te funkcje, wraz z wymogiem, że wszystkie posty są samodzielne, stanowią niektóre z zalet SO jako platformy, która odróżnia ją od forum. Możesz edytować, aby dodać dodatkowe informacje i / lub uzupełnić swoje objaśnienia dokumentacją źródłową.
ysf

-1

zmień tabelę / ** wklej nazwę tabala ** / dodaj id int TOŻSAMOŚĆ (1,1)

usuń z / ** wklej nazwę tabala ** / gdzie id

(

wybierz a. id Z / ** wklej nazwę tabala / jako LEWĄ DOŁĄCZ DO ZEWNĘTRZNEGO (WYBIERZ MIN (id) jako id Z / wklej nazwę tabala / GROUP BY / wklej kolumny c1, c2 .... ** /

) as t1 
ON a.id = t1.id

GDZIE t1.id jest NULL

)

zmień tabelę / ** wklej nazwę tabala ** / DROP COLUMN id


Jakie jest Twoje pytanie? Jak zapytać
Ann Kilzer,

1
Edytuj swoją odpowiedź, używając markdown, aby poprawnie sformatować swój przykładowy kod.
Bill Keller

-3

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

UŻYJ swojej_bazy_danych
UDAĆ SIĘ
GDZIE (WYBIERZ LICZBA (*) Z twojego_tabeli GDZIE twoje_id_field jest NULL)> 0
ZACZYNAĆ
    USTAW ROWCOUNT 1
    AKTUALIZUJ twoj_tabela USTAW twoje_id_field = MAX (twoje_id_field) +1
KONIEC
PRINT „ALL DONE”

W ogóle tego nie testowałem, więc bądź ostrożny!


1
-1 nie odpowiada na pytanie (które dotyczy dodawania IDENTITYkolumn) i i tak by nie działało. UPDATE your_table SET your_id_field = MAX(your_id_field)+1nie możesz się tam po prostu rzucić MAX. Gdzie jest WHEREklauzula, której należy unikać po prostu wielokrotne aktualizowanie tego samego wiersza?
Martin Smith,

-3

Działa to w MariaDB, więc mam tylko nadzieję, że zadziała w SQL Server: upuść właśnie wstawioną kolumnę identyfikatora, a następnie użyj następującej składni:

ALTER TABLE nazwa_tabeli ADD id INT KLUCZ PODSTAWOWY AUTO_INCREMENT;

Nie potrzebujesz kolejnego stołu. To po prostu wstawia kolumnę id, czyni ją głównym indeksem i zapełnia ją kolejnymi wartościami. Jeśli SQL Server tego nie zrobi, przepraszam za marnowanie twojego czasu.


-3

ALTER TABLE nazwa_tabeli DODAJ ID KOLUMNY INT NIE NULL KLUCZ PODSTAWOWY AUTO_INCREMENT; To może być przydatne

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.