Anda tidak dapat mengubah kolom yang ada untuk identitas.
Anda memiliki 2 opsi,
Buat tabel baru dengan identitas & jatuhkan tabel yang ada
Buat kolom baru dengan identitas & jatuhkan kolom yang ada
Pendekatan 1. ( Tabel baru ) Di sini Anda dapat menyimpan nilai data yang ada di kolom identitas yang baru dibuat.
CREATE TABLE dbo.Tmp_Names
(
Id int NOT NULL
IDENTITY(1, 1),
Name varchar(50) NULL
)
ON [PRIMARY]
go
SET IDENTITY_INSERT dbo.Tmp_Names ON
go
IF EXISTS ( SELECT *
FROM dbo.Names )
INSERT INTO dbo.Tmp_Names ( Id, Name )
SELECT Id,
Name
FROM dbo.Names TABLOCKX
go
SET IDENTITY_INSERT dbo.Tmp_Names OFF
go
DROP TABLE dbo.Names
go
Exec sp_rename 'Tmp_Names', 'Names'
Pendekatan 2 ( Kolom baru ) Anda tidak dapat mempertahankan nilai data yang ada pada kolom identitas yang baru dibuat, kolom identitas akan menyimpan urutan angka.
Alter Table Names
Add Id_new Int Identity(1, 1)
Go
Alter Table Names Drop Column ID
Go
Exec sp_rename 'Names.Id_new', 'ID', 'Column'
Lihat posting Forum Microsoft SQL Server berikut untuk detail lebih lanjut:
Bagaimana mengubah kolom menjadi identitas (1,1)
IDENTITY(1, 1)
bagian dengan kolom kunci utamaDi SQL 2005 dan di atas, ada trik untuk menyelesaikan masalah ini tanpa mengubah halaman data tabel. Ini penting untuk tabel besar di mana menyentuh setiap halaman data dapat memakan waktu beberapa menit atau jam. Triknya juga berfungsi bahkan jika kolom identitas adalah kunci utama, adalah bagian dari indeks berkerumun atau tidak berkerumun, atau gotcha lainnya yang dapat meningkatkan solusi "tambah / hapus / ganti nama kolom" yang lebih sederhana.
Inilah triknya: Anda dapat menggunakan ALTER TABLE SQL Server ... Pernyataan SWITCH untuk mengubah skema tabel tanpa mengubah data, artinya Anda bisa mengganti tabel dengan IDENTITAS dengan skema tabel yang identik, tetapi tanpa kolom IDENTITAS. Trik yang sama berfungsi untuk menambahkan IDENTITAS ke kolom yang ada.
Biasanya, ALTER TABLE ... SWITCH digunakan untuk secara efisien mengganti partisi penuh dalam tabel dipartisi dengan partisi kosong baru. Tetapi juga bisa digunakan dalam tabel non-partisi juga.
Saya telah menggunakan trik ini untuk mengonversi, dalam waktu kurang dari 5 detik, kolom dari tabel baris 2,5 miliar dari IDENTITY ke non-IDENTITY (untuk menjalankan kueri multi-jam yang rencana kuerinya bekerja lebih baik untuk non-IDENTITY kolom), dan kemudian mengembalikan pengaturan IDENTITY, lagi dalam waktu kurang dari 5 detik.
Berikut ini contoh kode cara kerjanya.
Ini jelas lebih terlibat daripada solusi dalam jawaban lain, tetapi jika meja Anda besar ini bisa menjadi penyelamat nyata. Ada beberapa peringatan:
Ada artikel bagus tentang TechNet yang merinci persyaratan di atas.
UPDATE - Eric Wu punya komentar di bawah ini yang menambahkan info penting tentang solusi ini. Menyalinnya di sini untuk memastikannya mendapat lebih banyak perhatian:
Jika tabel diperpanjang secara aktif dengan baris baru (artinya Anda tidak memiliki banyak jika ada waktu henti antara menambahkan IDENTITY dan menambahkan baris baru, maka alih-alih
DBCC CHECKIDENT
Anda akan ingin menetapkan nilai seed identitas secara manual dalam skema tabel baru menjadi lebih besar dari ID terbesar yang ada dalam tabel, misIDENTITY (2435457, 1)
. Anda mungkin dapat memasukkan transaksiALTER TABLE...SWITCH
dan yangDBCC CHECKIDENT
dalam (atau tidak - belum menguji ini) tetapi sepertinya menetapkan nilai seed secara manual akan lebih mudah dan aman.Jelas, jika tidak ada baris baru yang ditambahkan ke tabel (atau mereka hanya ditambahkan sesekali, seperti proses ETL harian) maka kondisi balapan ini tidak akan terjadi, jadi
DBCC CHECKIDENT
tidak masalah.sumber
DBCC CHECKIDENT('<newTableName>')
segera setelah beralih. Lihat msdn.microsoft.com/en-us/library/ms176057.aspx untuk info lebih lanjut.Anda tidak dapat mengubah kolom menjadi kolom IDENTITAS. Yang perlu Anda lakukan adalah membuat kolom baru yang didefinisikan sebagai IDENTITAS dari awal, lalu letakkan kolom lama, dan ganti nama yang baru dengan nama lama.
Marc
sumber
Ada solusi keren yang dijelaskan di sini: SQL SERVER - Tambah atau Hapus Properti Identitas pada Kolom
Singkatnya edit secara manual tabel Anda di SQL Manager, alihkan identitas, JANGAN HEMAT perubahan, cukup tunjukkan skrip yang akan dibuat untuk perubahan, salin dan gunakan nanti.
Ini adalah penghemat waktu yang sangat besar, karena itu (skrip) berisi semua kunci asing, indeks, dll yang terkait dengan tabel yang Anda ubah. Menulis ini secara manual ... Ya ampun.
sumber
Pertimbangkan untuk menggunakan URUTAN alih-alih IDENTITAS .
DI sql server 2014 (saya tidak tahu tentang versi yang lebih rendah) Anda bisa melakukan ini secara sederhana, menggunakan urutan.
Dari sini: Urutan sebagai nilai default untuk sebuah kolom
sumber
Penjelasan sederhana
Ganti nama kolom yang ada menggunakan sp_RENAME
EXEC sp_RENAME 'Table_Name.Existing_ColumnName', 'New_ColumnName', 'COLUMN'
Contoh untuk Ganti Nama:
Kolom yang ada UserID diganti nama menjadi OldUserID
Kemudian tambahkan kolom baru menggunakan ubah kueri untuk ditetapkan sebagai kunci utama dan nilai identitas
Contoh untuk Set kunci Utama
Nama kolom yang baru dibuat adalah UserID
kemudian Jatuhkan Kolom yang Diubah Nama
Contoh untuk Drop berganti nama kolom
Sekarang kami telah menambahkan kunci primer dan identitas ke kolom yang ada di tabel.
sumber
Saya seorang pengembang java yang kebetulan bergabung dalam tim tanpa DBA dan di mana sebagai pengembang, saya tidak bisa mendapatkan hak DBA. Saya ditugaskan untuk memindahkan seluruh skema antara dua database, jadi tanpa memiliki DBA, saya harus melakukannya dan melakukannya dengan menjalankan skrip, tidak dapat menggunakan GUI di SQL Server 2008 karena saya tidak memiliki hak admin.
Namun, semuanya dipindahkan tanpa masalah, ketika menjalankan prosedur tersimpan pada skema baru. Pada tabel, saya menemukan saya kehilangan bidang identitas dalam sebuah tabel. Saya mengecek skrip yang membuat tabel dan itu ada di sana, namun, SQL Server tidak mendapatkannya ketika saya menjalankan skrip. Saya kemudian diberitahu oleh DBA bahwa dia telah melihat masalah yang sama sebelumnya.
Bagaimanapun, untuk SQL Server 2008, ini adalah langkah-langkah yang saya ambil untuk menyelesaikan masalah ini dan mereka bekerja, jadi saya memposting ini di sini dengan harapan ini akan membantu seseorang. Inilah yang saya lakukan karena saya memiliki dependensi FK pada tabel lain yang membuat ini lebih sulit:
Saya menggunakan kueri ini untuk memverifikasi identitas memang hilang dan untuk melihat dependensi pada tabel.
1.) Temukan statistik di atas meja:
2.) Buat duplikat, tabel baru yang identik, kecuali tambahkan bidang identitas pada bidang PK di tempat sebelumnya.
3.) Nonaktifkan identitas untuk memindahkan data.
4.) Transfer data.
5.) Verifikasi data yang ada.
6.) Aktifkan kembali identitas.
7.) Ini adalah skrip terbaik yang saya temukan untuk mendapatkan semua hubungan FK untuk memverifikasi tabel mana yang merujuk tabel asli sebagai dependensi dan saya menemukan banyak, jadi itu adalah penjaga!
8.) Pastikan Anda memiliki semua skrip PK dan FK untuk semua tabel yang terlibat, sebelum langkah berikutnya.
9.) Anda dapat mengklik kanan pada setiap kunci dan skrip ini menggunakan SQL Server 2008
10.) Jatuhkan FK dari tabel dependensi menggunakan sintaks ini:
11.) Jatuhkan meja asli:
13.) Langkah-langkah selanjutnya bergantung pada skrip yang Anda buat di SQL Server 2008 di langkah 9.
--Tambahkan PK ke tabel baru.
--Tambahkan FK ke tabel baru.
--Tambahkan FK kembali ke tabel ketergantungan.
14.) Verifikasi semuanya benar dan lengkap. Saya menggunakan GUI untuk melihat tabel.
15.) Ubah nama tabel baru menjadi nama tabel asli.
Akhirnya, semuanya berhasil!
sumber
Anda tidak dapat melakukannya seperti itu, Anda perlu menambahkan kolom lain, letakkan kolom asli dan ganti nama kolom baru atau buat tabel baru, salin data dan letakkan tabel lama diikuti dengan mengubah nama tabel baru ke yang lama meja
Jika Anda menggunakan SSMS dan mengatur properti identitas ke ON di perancang di sini adalah apa yang SQL Server lakukan di belakang layar. Jadi jika Anda memiliki tabel bernama [pengguna] inilah yang terjadi jika Anda membuat UserID dan identitas
Setelah mengatakan bahwa ada cara untuk meretas tabel sistem untuk mencapainya dengan menetapkan nilai bitwise tetapi itu tidak didukung dan saya tidak akan melakukannya
sumber
Seperti yang saya pahami dalam kasus normal, kami membuat tabel dengan kunci Primer yang memiliki properti Identity.
Jadi Ganti Nama atau Hapus kolom yang terkait dengan batasan Kunci Utama tidak akan mungkin karena Aturan kendala memvalidasi struktur kolom. Untuk mencapai ini, kita harus memproses beberapa langkah dengan cara berikut: Mari kita asumsikan TableName = 'Karyawan' dan ColumnName = 'EmployeeId' 1. Tambahkan kolom baru 'EmployeeId_new' di tabel 'Employee' ALTER TABLE Karyawan ADD EmployeeId_new INT IDENTITY ( 1,1)
Sekarang hapus kolom 'EmployeeId' dari tabel 'Employee'
ALTER TABLE Employee DROP COLUMN EmployeeId
Ini akan menimbulkan kesalahan karena aturan Kendala Kunci Utama berlaku dan memvalidasi struktur kolom.
* ### ' Msg 5074, Level 16, State 1, Line 1 Objek [PK_dbo.Employee] bergantung pada colmn [EmployeeId].' ###
Jadi kita harus menghapus batasan Primary Key terlebih dahulu dari tabel 'Employee' lalu kita dapat menghapus kolom
ALTER TABLE batasan DROP Karyawan [PK_dbo.Employee]
Sekarang kita dapat menghapus kolom 'EmployeeId' dari tabel 'Employee' seperti pada langkah sebelumnya di mana kita mendapatkan kesalahan.
ALTER TABLE DROP COLUMN EmployeeId
Sekarang Kolom 'EmployeeId' dihapus dari tabel Jadi kami akan Ganti nama kolom baru yang baru ditambahkan 'EmployeeId_new' dengan 'EmployeeId'
sp_rename 'Employee.EmployeeId', 'EmployeeId_new', 'COLUMN'
Untuk mengatur ulang tabel dalam bentuk yang sama seperti itu, kita harus menambahkan Batasan Kunci Primer untuk kolom 'EmployeeId'
ALTER TABLE Karyawan menambahkan kendala [PK_dbo.Employee] primary key (EmployeeId)
8. Sekarang tabel 'Karyawan' dengan 'EmployeeId' dimodifikasi untuk aturan Identitas bersama dengan batasan kunci utama yang ada
sumber
Dengan desain tidak ada cara sederhana untuk menghidupkan atau mematikan fitur identitas untuk kolom yang ada. Satu-satunya cara bersih untuk melakukan ini adalah membuat kolom baru dan menjadikannya kolom identitas atau membuat tabel baru dan memigrasikan data Anda.
Jika kita menggunakan SQL Server Management Studio untuk menghilangkan nilai identitas pada kolom "id", tabel sementara baru dibuat, data dipindahkan ke tabel sementara, tabel lama dihapus dan tabel baru diganti namanya.
Gunakan Management Studio untuk melakukan perubahan dan kemudian klik kanan pada desainer dan pilih "Generate Change Script".
Anda akan melihat bahwa inilah yang dilakukan SQL server di latar belakang.
sumber
Sayangnya, tidak ada satu; properti IDENTITY milik tabel dan bukan kolom.
Cara yang lebih mudah adalah melakukannya di GUI, tetapi jika ini bukan pilihan, Anda dapat menyalin data, menjatuhkan kolom, menambahkannya kembali dengan identitas, dan mengembalikan data.
Lihat di sini untuk akun pukulan demi pukulan.
sumber
Klik kanan pada nama tabel di Object Explorer. Anda akan mendapatkan beberapa opsi. Klik pada 'Desain'. Tab baru akan dibuka untuk tabel ini. Anda dapat menambahkan batasan Identitas di sini di 'Properti Kolom'.
sumber
Untuk memodifikasi properti identitas untuk kolom:
Itu dia, dan itu berhasil untuk saya
sumber
Jika Anda kebetulan menggunakan Visual Studio 2017+
Ini akan melakukan semuanya untuk Anda.
sumber
Jika poster asli sebenarnya ingin mengatur kolom yang ada menjadi
PRIMARY KEY
untuk tabel dan sebenarnya tidak perlu kolom menjadiIDENTITY
kolom (dua hal berbeda) maka ini dapat dilakukan melalui t-SQL dengan:Perhatikan tanda kurung di sekitar nama kolom setelah
PRIMARY KEY
opsi.Meskipun posting ini sudah tua dan saya membuat asumsi tentang kebutuhan pemohon, saya merasa informasi tambahan ini dapat membantu pengguna yang menemukan utas ini karena saya yakin percakapan dapat membuat orang percaya bahwa kolom yang ada tidak dapat disetel menjadi kunci primer tanpa menambahkannya sebagai kolom baru terlebih dahulu yang tidak benar.
sumber
Sesuai kondisi saya saat ini, saya mengikuti pendekatan ini. Saya ingin memberikan identitas ke tabel utama setelah data dimasukkan melalui skrip.
Karena saya ingin menambahkan identitas, maka selalu mulai dari 1 hingga Akhir jumlah catatan yang saya inginkan.
Ini akan membuat kolom kunci utama yang sama dengan identitas
Saya menggunakan tautan ini: https://blog.sqlauthority.com/2014/10/11/sql-server-add-auto-incremental-identity-column-to-table-after-creating-table/
Tambahkan kunci utama ke tabel yang ada
sumber
Saya tidak percaya Anda dapat mengubah kolom yang ada menjadi kolom identitas menggunakan tsql. Namun, Anda dapat melakukannya melalui tampilan desain Enterprise Manager.
Atau Anda bisa membuat baris baru sebagai kolom identitas, letakkan kolom lama, lalu ganti nama kolom baru Anda.
sumber
Pada dasarnya ada empat langkah logis.
Buat kolom Identity baru. Aktifkan Sisipkan Identitas untuk kolom baru ini.
Masukkan data dari kolom sumber (kolom yang ingin Anda konversi ke Identity) ke kolom baru ini.
Matikan Sisipkan Identitas untuk kolom baru.
Jatuhkan kolom sumber Anda & ganti nama kolom baru dengan nama kolom sumber.
Mungkin ada beberapa kompleksitas seperti bekerja di beberapa server dll.
Silakan merujuk artikel berikut untuk langkah-langkahnya (menggunakan ssms & T-sql). Langkah-langkah ini dimaksudkan untuk pemula dengan sedikit pegangan pada T-SQL.
http://social.technet.microsoft.com/wiki/contents/articles/23816.how-to-convert-int-column-to-identity-in-the-ms-sql-server.aspx
sumber
menghasilkan skrip untuk semua tabel dengan primary key = bigint yang tidak memiliki set identitas; ini akan mengembalikan daftar skrip yang dihasilkan dengan setiap tabel;
sumber