Saya perlu mengganti nama beberapa kolom di beberapa tabel dalam database SQLite. Saya tahu bahwa pertanyaan serupa telah ditanyakan pada stackoverflow sebelumnya, tapi itu untuk SQL secara umum, dan kasus SQLite tidak disebutkan.
Dari dokumentasi SQLite untuk ALTER TABLE , saya berpendapat bahwa tidak mungkin melakukan hal seperti itu "dengan mudah" (yaitu pernyataan ALTER TABLE tunggal).
Saya bertanya-tanya seseorang tahu tentang cara SQL generik melakukan hal seperti itu dengan SQLite.
sqlite
alter-table
joce
sumber
sumber
Jawaban:
Ini baru saja diperbaiki dengan 2018-09-15 (3.25.0)
Anda dapat menemukan sintaks baru yang didokumentasikan di bawah
ALTER TABLE
Sumber gambar: https://www.sqlite.org/images/syntax/alter-table-stmt.gif
Contoh:
demo db-fiddle.com
Dukungan Android
Pada saat penulisan, Android 27 API menggunakan paket SQLite versi 3.19 .
Berdasarkan versi saat ini bahwa Android menggunakan dan bahwa pembaruan ini datang dalam versi 3.25.0 dari SQLite, saya akan mengatakan Anda memiliki sedikit menunggu (sekitar API 33) sebelum dukungan untuk ini ditambahkan ke Android.
Dan, bahkan kemudian, jika Anda perlu mendukung versi yang lebih lama dari API 33, Anda tidak akan dapat menggunakan ini.
sumber
database.execSQL("ALTER TABLE content RENAME COLUMN archiveCount TO dismissCount")
. COLUM berwarna merah dan dikatakan UNTUK diharapkan, mendapat 'COLUMN' . Sayangnya Android masih menggunakan SQLite versi 3.19, itulah mengapa ini tidak berhasil untuk saya.Katakanlah Anda memiliki tabel dan perlu mengganti nama "colb" menjadi "col_b":
Pertama Anda mengganti nama tabel lama:
Kemudian buat tabel baru, berdasarkan tabel lama tetapi dengan nama kolom yang diperbarui:
Kemudian salin konten di seberang tabel asli.
Terakhir, jatuhkan meja lama.
Membungkus semua ini dalam
BEGIN TRANSACTION;
danCOMMIT;
mungkin juga merupakan ide yang bagus.sumber
.schema
Perintah SQLite berguna untuk menampilkanCREATE TABLE
pernyataan yang membuat tabel yang ada. Anda dapat mengambil outputnya, memodifikasi seperlunya, dan menjalankannya untuk membuat tabel baru. Perintah ini juga menunjukkanCREATE INDEX
perintah yang diperlukan untuk membuat indeks, yang harus mencakup keprihatinan Thomas. Tentu saja, pastikan untuk menjalankan perintah ini sebelum mengubah apa pun.Menggali, saya menemukan alat grafis multiplatform (Linux | Mac | Windows) yang disebut DB Browser untuk SQLite yang sebenarnya memungkinkan seseorang untuk mengubah nama kolom dengan cara yang sangat ramah pengguna!
Edit | Ubah Tabel | Pilih Tabel | Edit Field. Klik klik! Voila!
Namun, jika seseorang ingin berbagi cara terprogram untuk melakukan ini, saya akan senang mengetahui!
sumber
Meskipun benar bahwa tidak ada ALTER COLUMN, jika Anda hanya ingin mengubah nama kolom, jatuhkan batasan NOT NULL, atau ubah tipe data, Anda dapat menggunakan serangkaian perintah berikut:
Catatan: Perintah-perintah ini berpotensi merusak database Anda, jadi pastikan Anda memiliki cadangan
Anda harus menutup dan membuka kembali koneksi Anda atau menyedot database untuk memuat ulang perubahan ke dalam skema.
Sebagai contoh:
DAFTAR PUSTAKA BERIKUT:
pragma writable_schema
Ketika pragma ini aktif, tabel SQLITE_MASTER di mana database dapat diubah menggunakan pernyataan UPDATE, INSERT, dan DELETE biasa. Peringatan: penyalahgunaan pragma ini dapat dengan mudah menghasilkan file basis data yang rusak.
alter table
SQLite mendukung subset terbatas dari ALTER TABLE. Perintah ALTER TABLE dalam SQLite memungkinkan pengguna untuk mengubah nama tabel atau menambahkan kolom baru ke tabel yang sudah ada. Tidak mungkin untuk mengganti nama kolom, menghapus kolom, atau menambah atau menghapus batasan dari tabel.
sumber
Baru-baru ini saya harus melakukan itu di SQLite3 dengan tabel bernama poin dengan colunms id, lon, lat . Secara keliru, ketika tabel diimpor, nilai-nilai untuk lintang tempat disimpan dalam kolom lon dan sebaliknya, jadi perbaikan yang jelas akan mengubah nama kolom tersebut. Jadi triknya adalah:
Saya harap ini bermanfaat bagi Anda!
sumber
Mengutip dokumentasi sqlite :
Yang bisa Anda lakukan tentu saja adalah, buat tabel baru dengan tata letak baru
SELECT * FROM old_table
,, dan isi tabel baru dengan nilai-nilai yang akan Anda terima.sumber
Pertama, ini adalah salah satu hal yang mengejutkan saya: mengganti nama kolom membutuhkan membuat tabel yang sama sekali baru dan menyalin data dari tabel lama ke tabel baru ...
GUI yang saya gunakan untuk melakukan operasi SQLite adalah Base . Itu punya jendela Log bagus yang menunjukkan semua perintah yang telah dieksekusi. Melakukan penggantian nama kolom melalui Base mengisi jendela log dengan perintah yang diperlukan:
Ini kemudian dapat dengan mudah disalin dan ditempel di mana Anda mungkin membutuhkannya. Bagi saya, itu menjadi file migrasi ActiveAndroid . Sentuhan yang bagus, juga, adalah bahwa data yang disalin hanya mencakup perintah SQLite, bukan cap waktu, dll.
Semoga itu menghemat waktu beberapa orang.
sumber
BEGIN TRANSACTION;
danCOMMIT;
garis, sebagai ActiveAndroid pegangan yang dengan sendirinya.KASUS 1: SQLite 3.25.0+
Hanya Versi 3.25.0 dari SQLite yang mendukung penggantian nama kolom. Jika perangkat Anda memenuhi persyaratan ini, semuanya cukup sederhana. Kueri di bawah ini akan menyelesaikan masalah Anda:
KASUS 2: SQLite Versi Lama
Anda harus mengikuti Pendekatan yang berbeda untuk mendapatkan hasil yang mungkin sedikit rumit
Misalnya, jika Anda memiliki tabel seperti ini:
Dan jika Anda ingin mengubah nama kolom
Location
Langkah 1: Ganti nama tabel asli:
Langkah 2: Sekarang buat tabel baru
student
dengan nama kolom yang benar:Langkah 3: Salin data dari tabel asli ke tabel baru:
Catatan: Perintah di atas harus semuanya satu baris.
Langkah 4: Jatuhkan tabel asli:
Dengan empat langkah ini, Anda dapat mengubah tabel SQLite secara manual. Ingatlah bahwa Anda juga harus membuat ulang indeks, pemirsa, atau pemicu di tabel baru juga.
sumber
ubah kolom tabel <id> menjadi <_id>
sumber
Buat kolom baru dengan nama kolom yang diinginkan: COLNew.
Salin konten kolom lama COLOld ke kolom baru COLNew.
Catatan: tanda kurung diperlukan pada baris di atas.
sumber
Seperti disebutkan sebelumnya, ada alat Database Browser SQLite, yang melakukan ini. Untungnya, alat ini menyimpan log dari semua operasi yang dilakukan oleh pengguna atau aplikasi. Lakukan ini sekali dan melihat log aplikasi, Anda akan melihat kode yang terlibat. Salin kueri dan rekatkan sesuai kebutuhan. Bekerja untukku. Semoga ini membantu
sumber
Dari dokumentasi resmi
Prosedur yang lebih sederhana dan lebih cepat secara opsional dapat digunakan untuk beberapa perubahan yang tidak mempengaruhi konten pada disk dengan cara apa pun. Prosedur sederhana berikut ini sesuai untuk menghapus PERIKSA atau KUNCI ASING atau BUKAN NULL kendala, mengganti nama kolom , atau menambah atau menghapus atau mengubah nilai default pada kolom.
Mulai transaksi.
Jalankan PRAGMA schema_version untuk menentukan nomor versi skema saat ini. Nomor ini akan diperlukan untuk langkah 6 di bawah ini.
Aktifkan pengeditan skema menggunakan PRAGMA writable_schema = ON.
Jalankan pernyataan UPDATE untuk mengubah definisi tabel X di tabel sqlite_master: UPDATE sqlite_master SET sql = ... WHERE type = 'table' AND name = 'X';
Perhatian: Membuat perubahan ke tabel sqlite_master seperti ini akan membuat database rusak dan tidak dapat dibaca jika perubahan tersebut mengandung kesalahan sintaksis. Disarankan bahwa pengujian yang cermat atas pernyataan UPDATE dilakukan pada database kosong terpisah sebelum menggunakannya pada database yang berisi data penting.
Jika perubahan ke tabel X juga memengaruhi tabel atau indeks lain atau pemicu adalah tampilan dalam skema, maka jalankan pernyataan UPDATE untuk mengubah indeks dan tampilan tabel lainnya juga. Misalnya, jika nama kolom berubah, semua kendala, pemicu, indeks, dan tampilan ASE KUNCI LUAR NEGERI harus diubah.
Perhatian: Sekali lagi, membuat perubahan pada tabel sqlite_master seperti ini akan membuat database menjadi rusak dan tidak dapat dibaca jika perubahan tersebut mengandung kesalahan. Hati-hati menguji seluruh prosedur ini pada basis data pengujian terpisah sebelum menggunakannya pada database yang berisi data penting dan / atau membuat salinan cadangan dari basis data penting sebelum menjalankan prosedur ini.
Tambahkan nomor versi skema menggunakan PRAGMA schema_version = X di mana X adalah satu lebih dari jumlah versi skema yang ditemukan pada langkah 2 di atas.
Nonaktifkan pengeditan skema menggunakan PRAGMA writable_schema = OFF.
(Opsional) Jalankan PRAGMA integrity_check untuk memverifikasi bahwa perubahan skema tidak merusak database.
Komit transaksi dimulai pada langkah 1 di atas.
sumber
Salah satu opsi, jika Anda perlu melakukannya dalam keadaan darurat, dan jika kolom awal Anda dibuat dengan default, adalah membuat kolom baru yang Anda inginkan, menyalin konten ke sana, dan pada dasarnya "meninggalkan" kolom lama (tetap ada hadir, tetapi Anda tidak menggunakan / memperbaruinya, dll.)
ex:
Ini meninggalkan kolom (dan jika itu dibuat dengan TIDAK NULL tetapi tanpa default, maka sisipan di masa depan yang mengabaikannya mungkin gagal), tetapi jika itu hanya tabel sekali pakai, pengorbanan mungkin dapat diterima. Kalau tidak, gunakan salah satu jawaban lain yang disebutkan di sini, atau database lain yang memungkinkan penggantian nama kolom.
sumber
Sejak versi 2018-09-15 (3.25.0) sqlite mendukung penggantian nama kolom
https://sqlite.org/changes.html
sumber
sqlite3 yourdb .dump> /tmp/db.txt
sunting /tmp/db.txt ubah nama kolom di Buat baris
sqlite2 yourdb2 </tmp/db.txt
mv / pindahkan yourdb2 yourdb
sumber