Kunci primer kenaikan otomatis di SQL Server Management Studio 2012


447

Bagaimana cara auto incrementyang primary keydalam SQL Servertabel database, saya sudah melihat melalui forum tetapi tidak bisa melihat bagaimana.

Saya telah melihat properti tetapi tidak dapat melihat opsi, saya telah melihat jawaban di mana Anda pergi ke Identityproperti spesifikasi dan mengaturnya ke ya dan mengatur Identity incrementke 1, tetapi bagian itu berwarna abu-abu dan saya tidak dapat mengubah tidak untuk ya.

Pasti ada cara sederhana untuk melakukan ini tetapi saya tidak dapat menemukannya.


5
Apakah tipe data kolom kunci adalah int?
Raab

1
@CoDe aDDict yang sekarang ditetapkan sebagai char (10) tetapi saya dapat mengubahnya karena saya hanya berlatih, terima kasih
Ledgemonkey

Jawaban:


704

Pastikan bahwa tipe data kolom Kunci adalah intdan kemudian atur identitas secara manual, seperti yang ditunjukkan gambar

masukkan deskripsi gambar di sini

Atau jalankan saja kode ini

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

kode akan berjalan, jika IDbukan satu-satunya kolom dalam tabel

referensi gambar fifo


21
Hanya sedikit koreksi: The IDENTITYproperti dapat diterapkan untuk setiap jenis data numerik (sehingga bisa tinyint, smallint, int, bigint, numeric, decimal), satu-satunya kendala adalah bahwa hal itu tidak bisa mewakili jumlah pecahan (sehingga tidak dapat float atau real, tidak numericatau decimal dengan skala bukan nol ) dan ofc, spesifikasi identitas harus kompatibel dengan tipe data yang dipilih.
Pred

2
Bekerja, asalkan tidak ada kunci Asing dll
Andrew Day

3
Saya hanya ingin menambahkan, jika Anda sudah menetapkan nilai default pada kolom identitas Anda, (Is Identity) tetap berwarna abu-abu. Hapus nilai default, dan itu tersedia lagi.
CDspace

7
Jika Anda tidak dapat mengubah nilai, buka Alat-Pilihan-Desainer dan hapus centang pada opsi "mencegah penyimpanan perubahan yang memerlukan penciptaan ulang".
Jaume

185

Saat Anda membuat tabel, Anda bisa membuat IDENTITYkolom sebagai berikut:

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

The IDENTITYproperti akan auto-increment kolom naik dari nomor 1. (Perhatikan bahwa tipe data dari kolom harus integer.) Jika Anda ingin menambahkan ini ke kolom yang ada, gunakan ALTER TABLEperintah.

Sunting:
Diuji sedikit, dan saya tidak dapat menemukan cara untuk mengubah properti Identity melalui jendela Properti Kolom untuk berbagai tabel. Saya kira jika Anda ingin membuat kolom sebagai kolom identitas, Anda HARUS menggunakan ALTER TABLEperintah.


Ah, ini khusus untuk SQL Server 2008 r2 - sudahlah.
Josien

2
sintaks membuat tabel ini adalah praktik yang baik seperti yang disarankan oleh penulis posting ini dalam komentar, semoga membantu seseorang.
shaijut

88

Anda harus memperluas bagian Identitas untuk mengekspos kenaikan dan benih.

masukkan deskripsi gambar di sini

Sunting: Saya berasumsi bahwa Anda akan memiliki tipe data integer, bukan char (10). Yang masuk akal saya katakan dan valid ketika saya memposting jawaban ini


2
Ini yesdiklik karena char(10)(dari komentar baru saja diposting)
Martin Smith

@ Martin Smith ya itu tampaknya menjadi masalah umum, saya akan mengubah ini dan menguji, terima kasih banyak
Ledgemonkey

saat membuat tabel baru yang saya gunakan BookID int primary key identitysaya tidak menentukan seed dan increment, apakah itu praktik yang baik? karena saya melihat dokumentasi di MSDN Jika tidak ditentukan, standarnya adalah (1,1).
shaijut

40

Perluas basis data Anda, perluas tabel Anda klik kanan pada tabel Anda dan pilih desain dari dropdown. Terlihat seperti ini

Sekarang pergi Properti kolom di bawahnya gulir ke bawah dan temukan Spesifikasi Identitas , perluas itu dan Anda akan menemukan Apakah Identitas membuatnya Ya. Sekarang pilih Identity Increment tepat di bawahnya, berikan nilai yang ingin Anda tambahkan di dalamnya. masukkan deskripsi gambar di sini


1
sepertinya ini akan menjadi jawaban yang tepat untuk saya, hanya membuat tipe data int tidak akan melakukan trik, kan?
Drewdin

10

Mungkin saya kehilangan sesuatu tetapi mengapa ini tidak bekerja dengan objek URUTAN? Bukankah ini yang Anda cari?

Contoh:

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

Saat mereferensikan squence di katakanlah perintah INSERT gunakan saja:

NEXT VALUE FOR blah.blahsequence

Informasi dan opsi lebih lanjut untuk URUTAN


Solusi ini adalah yang benar jika Anda peduli dengan urutan waktu baris yang dimasukkan, karena IDENTITYkadang-kadang melompat meninggalkan celah maka kembali untuk mengisi celah itu lagi. Jadi IDENTITYtidak menjamin SELALU kondisi
incrmenet

1
@ Martin Smith Ups, tidak mengikuti tautan, kesalahan saya! Saya sudah terbiasa dengan MS-SQL tidak memiliki fitur tertentu yang kadang-kadang saya lupa bahwa ada versi yang lebih baru yang mendukung lebih banyak barang. Saya akan menghapus komentar saya karena ini mungkin membingungkan ... Jika dinyatakan lebih umum itu tetap valid: mungkin bahwa ia menggunakan RDBMS make / versi yang tidak mendukung objek URUTAN - terutama karena pertanyaan hanya diajukan pada beberapa bulan setelah SQL Server 2012 dirilis;)
Paul Groke

1
@FindOut_Quran Anda yakin celah di kolom IDENTITY terisi? Saya hanya bekerja dengan SQL Server 2005 di mana saya belum pernah melihat itu terjadi - celahnya tetap ada. Dan saya agak terkejut melihat hal itu terjadi pada RDBMS karena fitur seperti itu akan menjadi kombinasi aneh "tidak gratis" (kinerja-bijaksana) dan "tidak diinginkan" (setidaknya di sebagian besar aplikasi).
Paul Groke

@ PaulGroke Ya saya yakin. Anda dapat mencoba menggunakan transaksi untuk memasukkan 1000 baris, lalu rollback. Nilai idenetity akan tersumbat. Cobalah untuk memasukkan lebih banyak ribuan baris dan komit / atau kembalikan. Anda akan melihat kadang-kadang punggung untuk mengisi celah
FindOut_Quran

@FindOut_Quran Saya tidak bisa melihat bagaimana ini bisa terjadi. Kolom MS SQL IDENTITY menggunakan penghitung sederhana yang diunggulkan pada nilai yang dapat ditentukan pengguna dan kemudian ditambahkan oleh nilai yang dapat ditentukan pengguna. Anda bahkan dapat meminta dan mengatur ulang penghitung. Satu-satunya cara saya bisa melihat ini terjadi adalah ketika transaksi bersamaan melakukan "out of order". Yaitu transaksi yang pertama kali menabrak penghitung IDENTITY melakukan setelah transaksi lain. Dalam hal ini Anda akan memiliki celah berumur pendek yang kemudian terisi. Yang perlu untuk menghindari tabrakan. Counter IDENTITY tidak akan pernah melompat kembali.
Paul Groke

7

Saat Anda menggunakan Tipe Data: int Anda dapat memilih baris yang ingin Anda tambahkan otomatis dan pergi ke tag properti kolom. Di sana Anda dapat mengatur identitas ke 'ya'. Nilai awal untuk peningkatan otomatis juga dapat diedit di sana. Semoga saya bisa membantu;)


di mana properti kolom berada?

2

Saya punya masalah ini di mana saya sudah membuat tabel dan tidak bisa mengubahnya tanpa menjatuhkan tabel jadi apa yang saya lakukan adalah: (Tidak yakin ketika mereka menerapkan ini tetapi sudah di SQL 2016)

Klik kanan pada tabel di Object Explorer:

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

Kemudian lakukan edit pada naskah yang dikatakan oleh Josien; gulir ke bagian bawah di mana CREATE TABLEterdapat, temukan Kunci Utama Anda dan tambahkan IDENTITY(1,1)sampai akhir sebelum koma. Jalankan skrip.

Script DROP dan BUAT juga membantu saya karena masalah ini. (Yang ditangani skrip yang dihasilkan.)


1

Hati-hati seperti jika Anda ingin elemen ID menjadi contigius atau tidak. Sebagai SQLSERVER ID dapat melonjak 1000.

Examle: sebelum restart ID = 11 setelah restart, Anda memasukkan baris baru dalam tabel, maka id akan menjadi 1012.


1

Anda dapat menggunakan kata kunci IDENTITYsebagai tipe data ke kolom bersama dengan PRIMARY KEYkendala saat membuat tabel.
ex:

StudentNumber IDENTITY(1,1) PRIMARY KEY

Di sini '1' yang pertama berarti nilai awal dan yang kedua '1' adalah nilai yang bertambah.


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

MS SQL Server menggunakan kata kunci IDENTITY untuk melakukan fitur penambahan otomatis.

Dalam contoh di atas, nilai awal untuk IDENTITY adalah 1, dan itu akan bertambah 1 untuk setiap catatan baru.

Kiat: Untuk menentukan bahwa kolom "Personid" harus mulai dari nilai 10 dan bertambah 5, ubah ke IDENTITY (10,5).

Untuk menyisipkan catatan baru ke dalam tabel "Orang", kami TIDAK harus menentukan nilai untuk kolom "Personid" (nilai unik akan ditambahkan secara otomatis):


0

Jika tabel sudah diisi maka tidak mungkin untuk mengubah kolom ke kolom IDENTITAS atau mengonversinya menjadi kolom IDENTITAS. Anda akan perlu untuk mengekspor semua data maka Anda dapat mengubah jenis kolom ke IDENTITY atau sebaliknya dan kemudian mengimpor kembali data. Saya tahu ini adalah proses yang menyakitkan tetapi saya percaya tidak ada alternatif selain menggunakan urutan seperti yang disebutkan dalam posting ini.


1
Anda dapat menggunakan ALTER TABLE ... SWITCHuntuk hanya mengganti metadata tanpa harus menyentuh data sama sekali. mis. Lihat cara mengatur kenaikan otomatis setelah membuat tabel tanpa kehilangan data?
Martin Smith

1
Proses yang disebutkan dalam tautan yang Anda berikan melibatkan transfer data ke temp table dan back yang sesuai dengan pernyataan saya di atas. Jika saya salah tolong berikan saya contoh yang berfungsi.
Softec

1
Ada contoh yang berfungsi di tautan. Tidak ada "mentransfer data ke tabel temp dan kembali". `ALTER TABLE ... SWITCH` adalah perubahan metadata saja. Itu tidak memindahkan data apa pun.
Martin Smith
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.