Bagaimana mengubah datatype kolom dalam database SQL tanpa kehilangan data

198

Saya memiliki database SQL Server dan saya baru menyadari bahwa saya dapat mengubah jenis salah satu kolom dari intmenjadi bool.

Bagaimana saya bisa melakukan itu tanpa kehilangan data yang sudah dimasukkan ke dalam tabel itu?

Ivan Stoyanov
sumber
3
Sudahkah Anda mencoba membuat kolom bit baru, menyalin nilai-nilai dari kolom lama ke yang baru, menghapus yang lama dan mengganti nama yang baru? Semua ini dalam transaksi, tentu saja, untuk mengembalikan masalah.
Radu Caprescu
2
Anda mengatakan "Saya baru sadar bahwa saya dapat mengubah jenis dari salah satu kolom dari int ke bool" Tidak ada tipe data boolean. Ada sedikit. Apakah Anda bertanya bagaimana Anda dapat melakukan ini (karena 2 jawaban sejauh ini telah dibahas). Atau pertanyaan Anda "Saya baru sadar ini mungkin - Bagaimana SQL Server melakukan ini?"
Martin Smith

Jawaban:

329

Anda dapat dengan mudah melakukan ini menggunakan perintah berikut. Nilai 0 akan diubah menjadi 0 (BIT = false), yang lain akan berubah menjadi 1 (BIT = true).

ALTER TABLE dbo.YourTable
   ALTER COLUMN YourColumnName BIT

Pilihan lainnya adalah membuat kolom tipe baru BIT, mengisinya dari kolom lama, dan setelah selesai, letakkan kolom lama dan ganti nama yang baru dengan nama lama. Dengan begitu, jika terjadi kesalahan selama konversi, Anda selalu dapat kembali karena Anda masih memiliki semua data ..

marc_s
sumber
10
Dengan kata lain: NULLtetap NULL, 0menjadi False, nilai bukan nol (1, -1, 1999, -987 ...) menjadi True.
Álvaro González
2
Dan jangan pernah melakukan perubahan seperti ini dari GUI. Selalu membuatnya melalui skrip seperti ini. GUI akan menjatuhkan dan membuat ulang tabel dan itu jauh lebih memakan waktu. Jika meja besar dan sedang diproduksi, ini bisa menjadi bencana. Plus semua perubahan tabel harus memiliki skrip yang ada dalam kontrol sumber seperti semua kode lainnya.
HLGEM
1
Saya akan menambahkan, pastikan Anda memiliki cadangan saat ini dari database sebelum membuat perubahan struktural ke tabel dengan data. Dan jangan menjalankan perubahan seperti ini pada produksi selama jam penggunaan puncak jika tabel sering digunakan atau besar.
HLGEM
Saya secara keliru menyetujui hasil edit ... perlu ditolak .. karena tidak ada perbaikan di sana ... Ans sempurna.
Vikash Pathak
22
ALTER TABLE tablename
ALTER COLUMN columnname columndatatype(size)

Catatan: jika ada ukuran kolom, cukup tulis ukurannya juga.

Xyed Xain Haider
sumber
20

Jika itu perubahan yang valid.

Anda dapat mengubah properti.

Alat -> Opsi -> Desainer -> Desainer Tabel dan Database -> Hapus centang -> Cegah perubahan simpanan yang diperlukan pembuatan ulang tabel.

Sekarang Anda dapat dengan mudah mengubah nama kolom tanpa membuat ulang tabel atau kehilangan catatan Anda.

Sathish
sumber
5
Dalam situasi apa pun Anda tidak perlu membuat perubahan tabel menggunakan GUI. Ini benar-benar akan membuat ulang tabel daripada menggunakan tabel Alter dan ini akan menyebabkan masalah jika Anda menghapus centang ini dan tabelnya besar. Selanjutnya Anda harus memiliki semua perubahan pada tabel dalam skrip di kontrol sumber.
HLGEM
Lihatlah lebih dekat pada opsi itu - mematikan keamanan yang akan mencegah GUI menjatuhkan meja. Tampaknya Anda tidak akan kehilangan data, karena GUI akan membuat ulang tabel, tetapi di server akan menyalin / menjatuhkan. Jadi, jika ada banyak data dalam tabel, itu akan menyebabkan operasi yang sangat besar. Juga, saya pikir (tidak positif) bahwa itu terjadi dalam satu transaksi, karena itu Anda dapat mengisi log transaksi Anda.
JMarsch
1
Saya kira saya ingin menambahkan sedikit klarifikasi ke komentar saya sebelumnya. Jika Anda hanya melakukan ini pada mesin pengembangan Anda, Anda mungkin baik-baik saja. Tapi saya tidak akan menyarankan menggunakan metode ini pada basis data produksi - terutama jika itu adalah misi kritis.
JMarsch
8

Menurut Anda mengapa Anda akan kehilangan data? Cukup masuk ke Studio Manajemen dan ubah tipe datanya. Jika nilai yang ada dapat dikonversi menjadi bool (bit), itu akan melakukannya. Dengan kata lain, jika "1" memetakan ke true dan "0" memetakan ke false di bidang asli Anda, Anda akan baik-baik saja.

Philippe Leybaert
sumber
1
Jika Anda memiliki data dalam tabel ini tidak akan berfungsi. Ketika Anda mencoba untuk mengubah jenis kolom, SMS mengklaim bahwa ia perlu menjatuhkan tabel terlebih dahulu ... yang tentu saja tidak benar karena perintah ALTER TABLE ... ALTER COLUMN bekerja dengan baik bahkan untuk bidang yang bukan NULL. Inilah sebabnya mereka berpikir mereka bisa kehilangan data.
Tony O'Hagan
1
@ TonyO'Hagan Itu tidak benar. Anda dapat mematikan peringatan dan itu akan berfungsi dengan baik dengan data yang ada. Lihat juga stackoverflow.com/questions/2947865/…
Philippe Leybaert
1
OK keren! Tidak tahu itu. Hanya mencoba untuk memilih Anda (kembali) tetapi SO mencegah saya kecuali Anda mengedit jawaban Anda. Mungkin perubahan kecil dan saya bisa melakukannya;).
Tony O'Hagan
1
Dalam situasi apa pun Anda tidak perlu membuat perubahan tabel menggunakan GUI. Ini benar-benar akan membuat ulang tabel daripada menggunakan tabel Alter dan ini akan menyebabkan masalah jika Anda tidak mencentang ini dan tabelnya besar. Selanjutnya Anda harus memiliki semua perubahan pada tabel dalam skrip di kontrol sumber.
HLGEM
Dalam situasi apa pun. Tidak ada alasan untuk menggunakan GUI untuk mendesain tabel atau mengubahnya dan alasan bagus untuk tidak melakukannya. Semua perubahan harus dalam skrip untuk dapat menyebar ke server lain dan diperlakukan seperti kode yang sebenarnya ada di kontrol sumber.
HLGEM
5

jika Anda menggunakan T-SQL (MSSQL); Anda harus mencoba skrip ini:

ALTER TABLE [Employee] ALTER COLUMN [Salary] NUMERIC(22,5)

jika Anda menggunakan MySQL; Anda harus mencoba skrip ini:

ALTER TABLE [Employee] MODIFY COLUMN [Salary] NUMERIC(22,5)

jika Anda menggunakan Oracle; Anda harus mencoba skrip ini:

ALTER TABLE [Employee] MODIFY [Salary] NUMERIC(22,5)
NullException
sumber
3

Pergi ke Alat-Opsi-desainer-Tabel dan Database desainer dan Hapus centang opsi Cegah penghematanmasukkan deskripsi gambar di sini

saktiprasad swain
sumber
1
Dalam situasi apa pun Anda tidak perlu membuat perubahan tabel menggunakan GUI. Ini benar-benar akan membuat ulang tabel daripada menggunakan tabel Alter dan ini akan menyebabkan masalah jika Anda tidak mencentang ini dan tabelnya besar. Selanjutnya Anda harus memiliki semua perubahan pada tabel dalam skrip di kontrol sumber.
HLGEM
2

Ubah tipe data kolom dengan tipe centang kolom:

IF EXISTS(
       SELECT 1
       FROM   sys.columns
       WHERE  NAME = 'YourColumnName'
              AND [object_id] = OBJECT_ID('dbo.YourTable')
              AND TYPE_NAME(system_type_id) = 'int'
   )
    ALTER TABLE dbo.YourTable ALTER COLUMN YourColumnName BIT
Ebrahim Sabeti
sumber
1

bagi saya, di sql server 2016, saya melakukannya seperti ini

* Untuk mengganti nama kolom, Kolom1 ke kolom2

EXEC sp_rename 'dbo.T_Table1.Column1', 'Column2', 'COLUMN'

* Untuk memodifikasi kolom Ketikkan dari string ke int :( Pastikan data dalam format yang benar )

ALTER TABLE dbo.T_Table1 ALTER COLUMN Column2  int; 
MNF
sumber
0

Dalam edisi ringkas akan mengambil ukuran secara otomatis untuk tipe data datetime yaitu (8) sehingga tidak perlu mengatur ukuran bidang dan menghasilkan kesalahan untuk operasi ini ...

Hardik
sumber
-2

Saya bisa memodifikasi datatype bidang tabel, dengan permintaan berikut: dan juga di Oracle DB,

ALTER TABLE table_name
MODIFY column_name datatype;
Ismayil S
sumber
Tidak di SQl Server
HLGEM
-4

Ganti datatype tanpa kehilangan data

alter table tablename modify columnn  newdatatype(size);
pengguna7743491
sumber