Aku punya tabel dengan kolom name
, qty
, rate
. Sekarang saya perlu menambahkan kolom baru COLNew
di antara kolom name
dan qty
. Bagaimana cara menambahkan kolom baru di antara dua kolom?
354
Anda memiliki dua opsi. Pertama, Anda bisa menambahkan kolom baru dengan yang berikut ini:
ALTER TABLE {tableName} ADD COLUMN COLNew {type};
Kedua, dan lebih rumit, tetapi sebenarnya akan menempatkan kolom di tempat yang Anda inginkan, adalah mengganti nama tabel:
ALTER TABLE {tableName} RENAME TO TempOldTable;
Kemudian buat tabel baru dengan kolom yang hilang:
CREATE TABLE {tableName} (name TEXT, COLNew {type} DEFAULT {defaultValue}, qty INTEGER, rate REAL);
Dan isi dengan data lama:
INSERT INTO {tableName} (name, qty, rate) SELECT name, qty, rate FROM TempOldTable;
Kemudian hapus tabel lama:
DROP TABLE TempOldTable;
Saya lebih suka opsi kedua, karena akan memungkinkan Anda untuk mengubah nama semuanya jika perlu.
PRAGMA foreign_keys = ON;
(lihat sqlite.org/foreignkeys.html#fk_enable )Anda tidak menambahkan kolom antara kolom lain dalam SQL, Anda hanya menambahkannya. Di mana mereka ditempatkan sepenuhnya terserah pada DBMS. Tempat yang tepat untuk memastikan bahwa kolom keluar dalam urutan yang benar adalah ketika Anda
select
melakukannya.Dengan kata lain, jika Anda menginginkannya dalam urutan
{name,colnew,qty,rate}
, Anda menggunakan:Dengan SQLite, Anda perlu menggunakan
alter table
, contohnya adalah:sumber
SELECT * FROM mytable
?select *
sama sekali. Terkadang berguna untuk program yang ingin melakukan pencarian tabel tetapi, untuk sebagian besar penggunaan, Anda harus secara eksplisit menentukan apa yang Anda inginkan dan karenanya urutan yang Anda inginkan.Anda dapat menambahkan kolom baru dengan kueri
Tapi itu akan ditambahkan di akhir, bukan di antara kolom yang ada.
sumber
SQLite memiliki dukungan ALTER TABLE terbatas yang dapat Anda gunakan untuk menambahkan kolom ke ujung tabel atau mengubah nama tabel.
Jika Anda ingin membuat perubahan yang lebih kompleks dalam struktur tabel, Anda harus membuat ulang tabel. Anda dapat menyimpan data yang ada ke tabel sementara, letakkan tabel lama, buat tabel baru, lalu salin kembali data dari tabel sementara.
Misalnya, Anda memiliki tabel bernama "t1" dengan nama kolom "a" dan "c" dan Anda ingin menyisipkan kolom "b" dari tabel ini. Langkah-langkah berikut menggambarkan bagaimana ini bisa dilakukan:
Sekarang Anda siap untuk memasukkan data baru seperti:
sumber
INSERT INTO t1 SELECT a,c FROM t1_backup;
menyebabkan kesalahan: "tabel t1 memiliki 3 kolom tetapi 2 nilai disediakan: INSERT INTO t1 SELECT a, c FROM t1_backup;". Baris yang benar adalahINSERT INTO t1 (a,c) SELECT a,c FROM t1_backup;
Pembaruan ini diperlukan untuk menangani nilai nol, dengan memasukkan nilai default seperti yang Anda butuhkan. Seperti dalam kasus Anda, Anda perlu menelepon
SELECT
permintaan dan Anda akan mendapatkan urutan kolom, seperti yang sudah dikatakan paxdiablo :dan menurut saya, nama kolom Anda untuk mendapatkan nilai dari kursor:
jadi jika indeks berubah, aplikasi Anda tidak akan menghadapi masalah.
Ini adalah cara yang aman dalam arti bahwa sebaliknya, jika Anda menggunakan
CREATE temptable
atauRENAME table
atauCREATE
, akan ada kemungkinan tinggi kehilangan data jika tidak ditangani dengan hati-hati, misalnya dalam kasus di mana transaksi Anda terjadi saat baterai habis.sumber
Saya menghadapi masalah yang sama dan metode kedua yang diusulkan dalam jawaban yang diterima, seperti yang disebutkan dalam komentar, bisa bermasalah ketika berhadapan dengan kunci asing.
Solusi saya adalah mengekspor database ke file sql memastikan bahwa pernyataan INSERT menyertakan nama kolom. Saya melakukannya menggunakan DB Browser untuk SQLite yang memiliki fitur praktis untuk itu. Setelah itu Anda hanya perlu mengedit pernyataan buat tabel dan masukkan kolom baru di mana Anda inginkan dan buat ulang db.
Dalam * nix like systems hanyalah sesuatu yang sejalan
Saya tidak tahu bagaimana layaknya ini dengan database yang sangat besar, tetapi ini berhasil dalam kasus saya.
sumber