SQL Server menambahkan kunci primer kenaikan otomatis ke tabel yang ada

253

Sebagai judul, saya memiliki tabel yang sudah ada yang sudah diisi dengan 150000 catatan. Saya telah menambahkan kolom Id (yang saat ini nol).

Saya berasumsi saya dapat menjalankan kueri untuk mengisi kolom ini dengan angka tambahan, dan kemudian menetapkan sebagai kunci utama dan mengaktifkan kenaikan otomatis. Apakah ini cara yang benar untuk melanjutkan? Dan jika demikian, bagaimana cara saya mengisi angka awal?

rencana ketakutan
sumber

Jawaban:

429

Tidak - Anda harus melakukannya sebaliknya: tambahkan langsung dari awal INT IDENTITY- karena akan diisi dengan nilai identitas saat Anda melakukan ini:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY

dan kemudian Anda bisa menjadikannya sebagai kunci utama:

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

atau jika Anda lebih suka melakukan semuanya dalam satu langkah:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY
       CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED
marc_s
sumber
2
Ini adalah jawaban yang sangat bagus, tetapi bagaimana saya bisa mengubah integer awal dari 1 menjadi 1000? Saya ingin mulai menghitung pada 1000. Saya curiga saya dapat menggunakan ALTER TABLE ORDER ALTER COLUMN ORDERNO RESTART WITH 1tetapi saya tidak ingin mencobanya tanpa memeriksa dengan seorang ahli :) Ref. pic.dhe.ibm.com/infocenter/iseries/v7r1m0/…
user1477388
3
Saya hanya menggunakan ini dan tampaknya berhasilalter table attachments add ATTACHMENT_NUMBER int identity (1000, 1)
user1477388
1
@stom: jika Anda tidak menentukan apa pun, seed = 1 dan increment = 1 akan digunakan - yang merupakan pengaturan yang paling sering digunakan. Jika Anda membuat tabel seperti ini - itu akan berfungsi dengan baik. Tetapi saya akan merekomendasikan untuk selalu secara eksplisit menentukan seed dan increment dalam skrip SQL Anda - terutama untuk situs yang lebih besar. Ini latihan yang bagus.
marc_s
1
@stom: yah, PRIMARY KEYimplikasi yang NOT NULLada - jadi sekali lagi - itu tidak mutlak diperlukan. Tapi saya lebih suka eksplisit dan jadi saya selalu ada di NOT NULLsana, hanya untuk menjadi jelas
marc_s
3
@ turbo88: ketika Anda mendefinisikan Anda PRIMARY KEY, indeks berkerumun dibuat secara otomatis untuk Anda (kecuali jika Anda secara eksplisit menentukan NONCLUSTERED)
marc_s
19

Anda tidak dapat "menghidupkan" IDENTITAS: itu adalah tabel yang dibangun kembali.

Jika Anda tidak peduli dengan urutan nomor, Anda akan menambahkan kolom, BUKAN NULL, dengan IDENTITAS sekaligus. 150k baris tidak banyak.

Jika Anda perlu mempertahankan urutan nomor, maka tambahkan nomor yang sesuai. Kemudian gunakan desainer tabel SSMS untuk mengatur properti IDENTITY. Ini memungkinkan Anda untuk membuat skrip yang akan melakukan drop kolom / tambahkan / simpan nomor / reseed untuk Anda.

gbn
sumber
5
OP ada di SQL Server 2008 sehingga ada cara
Martin Smith
Seluruh instance harus dimulai dalam mode pengguna tunggal jadi mungkin tidak dapat dilakukan untuk sebagian besar keadaan tetapi ALTER TABLE ... SWITCHdapat melakukannya tanpa itu.
Martin Smith
11

Saya memiliki masalah ini, tetapi tidak dapat menggunakan kolom identitas (karena berbagai alasan). Saya memutuskan ini:

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

Dipinjam dari sini .

Kevin
sumber
4

Jika kolom sudah ada di tabel Anda dan itu adalah nol, Anda dapat memperbarui kolom dengan perintah ini (ganti id, tablename, dan tablekey):

UPDATE x
SET x.<Id> = x.New_Id
FROM (
  SELECT <Id>, ROW_NUMBER() OVER (ORDER BY <tablekey>) AS New_Id
  FROM <tablename>
  ) x
Renzo Ciot
sumber
Anda menghemat waktu saya dengan yang ini! Tambahan yang bagus untuk jawaban @ gbn.
Kristen Waite
2

Ketika kami menambahkan dan kolom identitas di tabel yang ada, maka secara otomatis akan mengisi tidak perlu mengisi secara manual.

pengguna3279092
sumber
2

oleh perancang Anda dapat menetapkan identitas (1,1) klik kanan pada tbl => desing => di bagian kiri (klik kanan) => properties => di kolom identitas pilih #column

Properti

kolom idendtity

Gustavo Herrera
sumber
1
Apakah Anda punya info tentang apakah ini pendekatan yang baik? OP bertanya apakah itu "cara yang benar untuk melanjutkan". Jawaban yang lebih lengkap dapat membantu mereka mengetahui pro / kontra dari pendekatan tersebut.
jinglesthula
Sungguh, saya menggunakan opsi ini di lingkungan pengembangan, jika Anda tidak meneruskan perubahan ini ke produksi, Anda harus memverifikasi dengan LIHAT DEPENDENSI jika bidang identitas sedang digunakan oleh beberapa prosedur Store atau pemicu.
gustavo herrera
2

Jika tabel Anda memiliki hubungan dengan tabel lain menggunakan kunci primer atau foriegen, mungkin tidak mungkin untuk mengubah tabel Anda. jadi Anda perlu menjatuhkan dan membuat tabel lagi.
Untuk mengatasi masalah ini, Anda perlu Menghasilkan Script dengan mengklik kanan pada database dan dalam opsi lanjutan mengatur tipe data ke script untuk skema dan data. setelah itu, gunakan skrip ini dengan mengubah kolom Anda untuk mengidentifikasi dan membuat ulang tabel menggunakan menjalankan kueri.
kueri Anda akan seperti di sini:

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 
Hamid
sumber
0

Inilah ide yang bisa Anda coba. Tabel asli - tidak ada kolom identitas table1 membuat tabel baru - panggilan table2 bersama dengan kolom identitas. salin data dari table1 ke table2 - kolom identitas diisi secara otomatis dengan angka yang bertambah secara otomatis.

ganti nama tabel asli - table1 ke table3 ganti nama tabel baru - table2 ke table1 (tabel asli) Sekarang Anda memiliki table1 dengan kolom identitas dimasukkan dan diisi untuk data yang ada. setelah memastikan tidak ada masalah dan berfungsi dengan baik, letakkan table3 saat tidak lagi diperlukan.

JH326
sumber
0

Buat Tabel baru Dengan nama berbeda dan kolom yang sama, Kunci Primer dan asosiasi Kunci Asing dan tautkan ini dalam pernyataan kode Insert Anda. Untuk Misalnya: Untuk KARYAWAN, ganti dengan KARYAWAN.

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

Namun, Anda harus menghapus Tabel EMPLOYEE yang ada atau melakukan beberapa penyesuaian sesuai dengan kebutuhan Anda.

kumarP
sumber
0

Jawaban ini adalah tambahan kecil untuk jawaban terpilih tertinggi dan berfungsi untuk SQL Server. Pertanyaannya meminta kunci primer kenaikan otomatis, jawaban saat ini memang menambahkan kunci utama, tetapi tidak ditandai sebagai kenaikan otomatis. Script di bawah ini memeriksa kolom, keberadaan, dan menambahkannya dengan flag peningkatan otomatis diaktifkan.

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
John K.
sumber
0
ALTER TABLE table_name ADD temp_col INT IDENTITY(1,1) 
update 
sandesh jain
sumber
5
bisakah kamu menjelaskannya?
Muhammad Dyas Yaskur
1
Meskipun kode ini dapat menyelesaikan masalah OP, yang terbaik adalah memasukkan penjelasan tentang bagaimana kode Anda mengatasi masalah OP. Dengan cara ini, pengunjung masa depan dapat belajar dari posting Anda, dan menerapkannya pada kode mereka sendiri. SO bukan layanan pengkodean, tetapi sumber daya untuk pengetahuan. Juga, kualitas tinggi, jawaban lengkap lebih cenderung terunggulkan. Fitur-fitur ini, bersama dengan persyaratan bahwa semua posting mandiri, adalah beberapa kekuatan SO sebagai platform, yang membedakannya dari forum. Anda dapat mengedit untuk menambahkan info tambahan & / atau untuk melengkapi penjelasan Anda dengan dokumentasi sumber.
ysf
-1

ubah tabel / ** rekatkan nama tabal ** / tambahkan ID int IDENTITY (1,1)

hapus dari / ** rekatkan nama tabal ** / di mana id

(

pilih a.id DARI / ** tempelkan nama tabal / sebagai LEFT OUTER JOIN (SELECT MIN (id) sebagai id DARI / tempelkan nama tabal / GROUP BY / tempel kolom c1, c2 .... ** /

) as t1 
ON a.id = t1.id

DI MANA t1.id NULL

)

ubah tabel / ** rekatkan nama tabal ** / DROP COLUMN id

Mohamed Sakilani
sumber
Apa pertanyaanmu? Bagaimana cara bertanya
Ann Kilzer
1
Edit jawaban Anda, menggunakan markdown untuk memformat contoh kode Anda dengan benar.
Bill Keller
-3

Coba sesuatu seperti ini (pada tabel tes terlebih dahulu):

GUNAKAN nama_databaseAnda
PERGILAH
WHILE (SELECT COUNT (*) FROM your_table WHERE your_id_field ADALAH NULL)> 0
MULAI
    SET ROWCOUNT 1
    UPDATE your_table SET your_id_field = MAX (your_id_field) +1
AKHIR
PRINT 'ALL DONE'

Saya belum menguji ini sama sekali, jadi berhati-hatilah!

PacDemon
sumber
1
-1 Tidak menjawab pertanyaan (yaitu tentang menambahkan IDENTITYkolom) dan tidak akan berhasil. UPDATE your_table SET your_id_field = MAX(your_id_field)+1Anda tidak bisa hanya menyerah di MAXsana. Di mana WHEREklausa untuk menghindari berulang kali memperbarui baris yang sama?
Martin Smith
-3

Ini berfungsi di MariaDB, jadi saya hanya bisa berharap itu terjadi di SQL Server: jatuhkan kolom ID yang baru saja Anda masukkan, kemudian gunakan sintaks berikut: -

ALTER TABLE table_name ADD id INT PRIMARY KEY AUTO_INCREMENT;

Tidak perlu meja lain. Ini hanya menyisipkan kolom id, menjadikannya indeks utama, dan mengisinya dengan nilai sekuensial. Jika SQL Server tidak akan melakukan ini, permintaan maaf saya karena membuang waktu Anda.

Road Warrior
sumber
-3

ALTER TABLE table_name TAMBAH ID KOLOM KE BUKAN NULL PRIMARY KEY AUTO_INCREMENT; Ini bisa bermanfaat

Pembunuh
sumber