Automatyczne zwiększanie klucza podstawowego w SQL Server Management Studio 2012


447

Jak mogę w tabeli bazy danych, miałem wygląd poprzez forum, ale nie widzę w jaki sposób.auto incrementprimary keySQL Server

Poszukałem właściwości, ale nie widzę opcji, widziałem odpowiedź, w której przechodzisz do Identitywłaściwości specyfikacji, ustawiasz ją na tak i ustawiasz na Identity increment1, ale ta sekcja jest wyszarzona i nie mogę jej zmienić nie na tak.

Musi być prosty sposób, aby to zrobić, ale nie mogę tego znaleźć.


5
Czy typ danych kolumny klucza to int?
Raab

1
@CoDe aDDict jego obecny zestaw jako char (10), ale mogę to zmienić, gdy tylko ćwiczę, dzięki
Ledgemonkey

Odpowiedzi:


704

Upewnij się, że typem danych kolumny Klucz jest, inta następnie ręcznie ustaw tożsamość, jak pokazuje obrazek

wprowadź opis zdjęcia tutaj

Lub po prostu uruchom ten kod

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

kod zostanie uruchomiony, jeśli IDnie jest to jedyna kolumna w tabeli

obraz referencyjny fifo's


21
Wystarczy trochę korekty: the IDENTITYnieruchomość może być stosowana do wszystkich typów danych liczbowych (tak mogło być tinyint, smallint, int, bigint, numeric, decimal), jedynym ograniczeniem jest to, że nie może reprezentować liczbę ułamkową (tak, to nie może być float ani real, ani numericczy decimal ze skalą niezerową ) i ofc specyfikacja tożsamości powinna być zgodna z wybranym typem danych.
Pred

2
Prace, pod warunkiem, że nie ma kluczy obcych itp.
Andrew Day

3
Chciałem tylko dodać, jeśli ustawiłeś już domyślną wartość w kolumnie tożsamości, (Is Identity) pozostaje wyszarzone. Usuń wartość domyślną i stanie się ponownie dostępna.
CDspace

7
Jeśli nie możesz zmodyfikować wartości, przejdź do Narzędzia-Opcje-Projektanci i odznacz opcję „zapobiegaj zapisywaniu zmian wymagających ponownego utworzenia”.
Jaume

185

Podczas tworzenia tabeli możesz utworzyć IDENTITYkolumnę w następujący sposób:

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

IDENTITYNieruchomość będzie automatycznego przyrostu kolumna się od numeru 1. (Zauważ, że typ danych kolumny musi być liczbą całkowitą). Jeśli chcesz dodać do istniejącej kolumny, użyj ALTER TABLEpolecenia.

Edycja:
Testowałem trochę i nie mogę znaleźć sposobu na zmianę właściwości tożsamości w oknie Właściwości kolumny dla różnych tabel. Sądzę, że jeśli chcesz uczynić kolumnę kolumną tożsamości, musisz użyć ALTER TABLEpolecenia.


Ach, dotyczy to w szczególności SQL Server 2008 R2 - nieważne.
Josien

2
ta składnia tworzenia tabeli jest dobrą praktyką zalecaną przez autora tego postu w komentarzach, mam nadzieję, że komuś pomoże.
shaijut,

88

Musisz rozwinąć sekcję Tożsamość, aby wyświetlić przyrost i ziarno.

wprowadź opis zdjęcia tutaj

Edycja: Założyłem, że masz typ danych liczb całkowitych, a nie char (10). Co jest rozsądne, powiedziałbym i ważne, kiedy opublikowałem tę odpowiedź


2
yesJest wyszarzona, jak to jest char(10)(z komentarzem po prostu pisał)
Martin Smith

@Martin Smith tak, to wydaje się być ogólnym problemem, zamierzam to zmienić i przetestować,
wielkie

podczas tworzenia nowej tabeli, której użyłem, BookID int primary key identitynie określiłem zarówno nasion, jak i przyrostu, czy to dobra praktyka? ponieważ widzę dokumentację w MSDN Jeśli nie podano żadnej z nich, domyślną wartością jest (1,1).
shaijut

40

Rozwiń bazę danych, rozwiń tabelę, kliknij tabelę prawym przyciskiem myszy i wybierz projekt z menu rozwijanego. To wygląda tak

Teraz przejdź do właściwości kolumny poniżej i przewiń w dół i znajdź specyfikację tożsamości , rozwiń ją, a zobaczysz, że tożsamość sprawia, że ​​tak. Teraz wybierz opcję Zwiększanie tożsamości poniżej, podając wartość, którą chcesz zwiększyć. wprowadź opis zdjęcia tutaj


1
wydaje mi się, że to byłaby dla mnie poprawna odpowiedź, po prostu uczynienie typu danych int int nie dałoby rady, prawda?
Drewdin

10

Być może coś mi brakuje, ale dlaczego to nie działa z obiektem SEKWENCJA? Czy nie tego szukasz?

Przykład:

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

Odnosząc się do kwadratu, powiedzmy, polecenie INSERT, po prostu użyj:

NEXT VALUE FOR blah.blahsequence

Więcej informacji i opcji dla SEKWENCJI


To rozwiązanie jest poprawne, jeśli zależy Ci na kolejności czasowej wstawianych rzędów, ponieważ IDENTITYczasami podskakuje, pozostawiając luki, a następnie z powrotem wypełnia te luki. Więc IDENTITYnie gwarantuje ZAWSZE warunku
wstępnego

1
@Martin Smith Ups, nie podążałem za linkiem, mój błąd! Tak przyzwyczaiłem się do MS-SQL, że nie mam pewnych funkcji, że czasami zapominam, że są nowsze wersje, które obsługują więcej rzeczy. Skasuję mój komentarz, ponieważ może być mylący ... Jeśli jednak zostanie sformułowany bardziej ogólnie, pozostaje ważny: może oznaczać, że używa marki / wersji RDBMS, która nie obsługuje obiektów SEQUENCE - zwłaszcza, że ​​pytanie zostało zadane kilka miesięcy po wydaniu SQL Server 2012;)
Paul Groke

1
@FindOut_Quran Czy jesteś pewien, że luki w kolumnach TOŻSAMOŚCI są wypełnione? Pracowałem tylko z SQL Server 2005, gdzie nigdy tego nie widziałem - luki po prostu pozostają. Byłbym raczej zaskoczony, widząc, że dzieje się to na każdym RDBMS, ponieważ taka funkcja byłaby dziwną kombinacją „nieodpłatnego” (pod względem wydajności) i „niepożądanego” (przynajmniej w większości aplikacji).
Paul Groke,

@PaulGroke Tak, jestem pewien. Możesz spróbować użyć transakcji do wstawienia 1000 wierszy, a następnie wycofania. Wartość identyfikatora wzrośnie. Spróbuj wstawić więcej tysięcy wierszy i zatwierdzić / wycofać. Zauważysz, że czasami cofa się, aby wypełnić luki
FindOut_Quran

@FindOut_Quran Nie widzę, jak to się mogło stać. Kolumny TOŻSAMOŚĆ MS SQL używają prostego licznika, który jest inicjowany według wartości definiowanej przez użytkownika, a następnie zwiększany o wartość definiowaną przez użytkownika. Możesz nawet wysłać zapytanie i zresetować licznik. Jedyny sposób, w jaki mogę to zobaczyć, polega na tym, że współbieżne transakcje zatwierdzają „poza kolejnością”. Tj. Transakcja, która po raz pierwszy podbiła licznik TOŻSAMOŚCI, zatwierdza po innej transakcji. W takim przypadku będziesz mieć krótkotrwałą lukę, która następnie zostanie wypełniona. Co jest konieczne, aby uniknąć kolizji. Licznik TOŻSAMOŚCI nigdy nie wskoczy z powrotem.
Paul Groke

7

Gdy używasz typu danych: int, możesz wybrać wiersz, który chcesz automatycznie zwiększyć, i przejść do tagu właściwości kolumny. Tam możesz ustawić tożsamość na „tak”. Można tam również edytować wartość początkową autowzrostu. Mam nadzieję, że mógłbym pomóc;)


gdzie znajdują się właściwości kolumny?

2

Miałem ten problem, w którym już utworzyłem tabelę i nie mogłem jej zmienić bez upuszczenia tabeli, więc zrobiłem to: (Nie jestem pewien, kiedy to zaimplementowali, ale mieli go w SQL 2016)

Kliknij prawym przyciskiem myszy tabelę w Eksploratorze obiektów:

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

Następnie zrób edycję skryptu napisanego przez Josiena; przewiń w dół, gdzie CREATE TABLEjest, znajdź swój klucz główny i dopisz IDENTITY(1,1)na końcu przed przecinkiem. Uruchom skrypt.

Skrypt DROP i CREATE również był dla mnie pomocny z powodu tego problemu. (Co obsługuje wygenerowany skrypt).


1

Zachowaj ostrożność, jeśli chcesz, aby elementy ID były równe, czy nie. Identyfikator SQLSERVER może przeskoczyć o 1000.

Przykład: przed ponownym uruchomieniem ID = 11 po ponownym uruchomieniu wstawiasz nowy wiersz do tabeli, wówczas identyfikator będzie wynosił 1012.


1

Możesz użyć słowa kluczowego IDENTITYjako typu danych do kolumny wraz z PRIMARY KEYograniczeniem podczas tworzenia tabeli.
dawny:

StudentNumber IDENTITY(1,1) PRIMARY KEY

Tutaj pierwsza „1” oznacza wartość początkową, a druga „1” jest wartością rosnącą.


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

MS SQL Server używa słowa kluczowego IDENTITY, aby wykonać funkcję automatycznego przyrostu.

W powyższym przykładzie wartość początkowa TOŻSAMOŚCI wynosi 1 i będzie zwiększana o 1 dla każdego nowego rekordu.

Wskazówka: Aby określić, że kolumna „Personid” powinna zaczynać się od wartości 10 i zwiększać ją o 5, zmień ją na TOŻSAMOŚĆ (10,5).

Aby wstawić nowy rekord do tabeli „Osoby”, NIE będziemy musieli określać wartości dla kolumny „Personid” (unikalna wartość zostanie dodana automatycznie):


0

Jeśli tabela jest już zapełniona, nie można zmienić kolumny na kolumnę IDENTITY ani przekonwertować jej na kolumnę non-IDENTITY. Musisz wyeksportować wszystkie dane, możesz zmienić typ kolumny na TOŻSAMOŚĆ lub odwrotnie, a następnie zaimportować dane z powrotem. Wiem, że jest to bolesny proces, ale wierzę, że nie ma alternatywy oprócz użycia sekwencji, jak wspomniano w tym poście.


1
Możesz użyć ALTER TABLE ... SWITCHdo przełączenia metadanych bez konieczności dotykania danych. np. Zobacz, jak ustawić automatyczny przyrost po utworzeniu tabeli bez utraty danych?
Martin Smith

1
Proces wymieniony w linku podanym przez ciebie obejmuje przeniesienie danych do tabeli tymczasowej iz powrotem, co jest zgodne z moim stwierdzeniem powyżej. Jeśli się mylę, proszę podać mi działający przykład.
Softec

1
W linku znajduje się działający przykład. Nie ma „przesyłania danych do tabeli tymczasowej iz powrotem”. „ALTER TABLE ... SWITCH” to zmiana tylko dla metadanych. Nie przenosi żadnych danych.
Martin Smith
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.