Saya membuat tabel di Sqlite dengan menggunakan CREATE TABLE AS
sintaks untuk membuat tabel berdasarkan SELECT
pernyataan. Sekarang tabel ini tidak memiliki kunci utama tetapi saya ingin menambahkannya.
Eksekusi ALTER TABLE table_name ADD PRIMARY KEY(col1, col2,...)
memberikan kesalahan sintaks "near PRIMARY"
Apakah ada cara untuk menambahkan kunci utama selama pembuatan tabel atau setelahnya di Sqlite?
Yang saya maksud dengan "selama penciptaan" adalah selama penciptaan dengan CREATE TABLE AS
.
Jawaban:
Anda tidak dapat mengubah tabel SQLite dengan cara apa pun setelah dibuat. Solusi yang disarankan yang diterima adalah membuat tabel baru dengan persyaratan yang benar dan menyalin data Anda ke dalamnya, lalu melepaskan tabel lama.
berikut adalah dokumentasi resmi tentang ini: http://sqlite.org/faq.html#q11
sumber
CREATE UNIQUE INDEX pkName ON tableName(columnName)
) ketika kerangka kerja DB seperti SMO MS SQL benar - benar membuat Anda menambahkan PK setelah tabel dibuat!Selama Anda menggunakan
CREATE TABLE
, jika Anda membuat kunci utama pada satu bidang , Anda dapat menggunakan:Dengan
CREATE TABLE
, Anda juga selalu dapat menggunakan pendekatan berikut untuk membuat kunci utama di satu atau beberapa bidang :Referensi: http://www.sqlite.org/lang_createtable.html
Jawaban ini tidak membahas perubahan tabel.
sumber
Saya mencoba menambahkan kunci utama setelah itu dengan mengubah tabel sqlite_master secara langsung. Trik ini sepertinya berhasil. Ini adalah solusi peretasan tentu saja.
Singkatnya: buat indeks reguler (unik) di atas tabel, kemudian buat skema dapat ditulis dan ubah nama indeks ke formulir yang disediakan oleh sqlite untuk mengidentifikasi indeks kunci utama, (yaitu sqlite_autoindex_XXX_1, dengan XXX adalah nama tabel) dan setel string sql ke NULL. Akhirnya ubah definisi tabel itu sendiri. Satu pittfal: sqlite tidak melihat perubahan nama indeks sampai database dibuka kembali. Ini sepertinya bug, tetapi bukan yang parah (bahkan tanpa membuka kembali database, Anda masih dapat menggunakannya).
Misalkan tabel terlihat seperti:
Kemudian saya melakukan hal berikut:
Beberapa tes (dalam shell sqlite):
sumber
Menurut dokumen sqlite tentang pembuatan tabel, menggunakan buat tabel sebagai pilih menghasilkan tabel baru tanpa batasan dan tanpa kunci utama.
Namun, dokumentasi juga mengatakan bahwa kunci utama dan indeks unik secara logis setara ( lihat bagian batasan ):
Jadi, bahkan jika Anda tidak dapat mengubah definisi tabel melalui sintaks alter SQL, Anda bisa mendapatkan efek kunci utama yang sama melalui penggunaan indeks unik.
Selain itu, setiap tabel (kecuali yang dibuat tanpa sintaks rowid) memiliki kolom integer dalam yang dikenal sebagai "rowid". Menurut dokumen, Anda bisa menggunakan kolom dalam ini untuk mengambil / mengubah tabel rekaman.
sumber
Anda bisa melakukannya seperti ini:
sumber
pengantar
Ini didasarkan pada Java Android dan ini adalah contoh yang baik untuk mengubah database tanpa mengganggu penggemar / pelanggan aplikasi Anda. Ini didasarkan pada ide halaman FAQ SQLite http://sqlite.org/faq.html#q11
Masalah
Saya tidak menyadari bahwa saya perlu menyetel row_number atau record_id untuk menghapus satu item yang dibeli dalam tanda terima, dan pada saat yang sama nomor barcode item menipu saya untuk berpikir menjadikannya sebagai kunci untuk menghapus item itu. Saya menyimpan detail tanda terima di tabel struk_barcode. Membiarkannya tanpa record_id bisa berarti menghapus semua record dari item yang sama dalam tanda terima jika saya menggunakan item barcode sebagai kuncinya.
Memperhatikan
Harap dipahami bahwa ini adalah salinan-tempel kode yang saya kerjakan pada saat penulisan ini. Gunakan hanya sebagai contoh, copy-paste secara acak tidak akan membantu Anda. Ubah ini terlebih dahulu sesuai kebutuhan Anda
Juga jangan lupa untuk membaca komentar di kode.
Kode
Gunakan ini sebagai metode di kelas Anda untuk memeriksa 1 apakah kolom yang ingin Anda tambahkan hilang. Kami melakukan ini hanya untuk tidak mengulangi proses mengubah kode tabel tanda terima. Sebut saja sebagai bagian dari kelas Anda. Pada langkah selanjutnya Anda akan melihat bagaimana kami akan menggunakannya.
Kemudian, kode berikut digunakan untuk membuat tabel tanda terima_barcode jika sudah TIDAK keluar untuk pengguna aplikasi Anda yang pertama kali. Dan harap perhatikan "JIKA TIDAK ADA" di kode. Itu penting.
sumber
Saya memiliki masalah yang sama dan solusi terbaik yang saya temukan adalah pertama-tama membuat tabel yang mendefinisikan kunci utama dan kemudian menggunakan masukkan ke dalam pernyataan.
sumber
Saya menggunakan sintaks CREATE TABLE AS untuk menggabungkan beberapa kolom dan mengalami masalah yang sama. Ini adalah AppleScript yang saya tulis untuk mempercepat proses.
sumber
Saya pikir menambahkan indeks pada kolom itu bisa mendapatkan efek yang hampir sama.
sumber
sumber
Gunakan alat seperti DB Browser untuk SQLite, ini memungkinkan untuk menambahkan PK, AI dengan mengklik kanan pada tabel -> ubah.
sumber