Saya mencoba menulis kueri yang akan memeriksa apakah tabel tertentu di MySQL memiliki kolom tertentu, dan jika tidak - buatlah. Kalau tidak, jangan lakukan apa-apa. Ini benar-benar prosedur yang mudah dalam basis data kelas perusahaan, namun MySQL tampaknya merupakan pengecualian.
Saya pikir sesuatu seperti
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='prefix_topic' AND column_name='topic_last_update')
BEGIN
ALTER TABLE `prefix_topic` ADD `topic_last_update` DATETIME NOT NULL;
UPDATE `prefix_topic` SET `topic_last_update` = `topic_date_add`;
END;
akan bekerja, tetapi gagal parah. Apakah ada cara?
Jawaban:
Ini bekerja dengan baik untuk saya.
Dengan PHP akan menjadi sesuatu seperti ...
sumber
@ julio
Terima kasih untuk contoh SQL. Saya mencoba query dan saya pikir perlu perubahan kecil untuk membuatnya berfungsi dengan baik.
Itu berhasil bagi saya.
Terima kasih!
sumber
IF
, dll. Lihat stackoverflow.com/questions/7384711/... untuk contoh cara membungkus suatu prosedur di sekitar tes untuk kolom dan pernyataan DML bersyarat.Hanya untuk membantu siapa saja yang mencari contoh konkret dari apa yang @Mchl gambarkan, coba sesuatu seperti
SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'my_schema' AND TABLE_NAME = 'my_table' AND COLUMN_NAME = 'my_column'
Jika mengembalikan false (hasil nol) maka Anda tahu kolom tidak ada.
sumber
TABLE_NAME = 'my_table'
, TABLE_SCHEMA adalah skema tempat tabelnya berada. YaituSELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'my_schema' AND TABLE_NAME = 'my_table' AND COLUMN_NAME = 'my_column'
Berikut ini adalah cara lain untuk melakukannya menggunakan PHP biasa tanpa basis data information_schema:
sumber
isset()
akan trow 'false' jika kunci array ada tetapi nilainya NULL . Lebih baik menggunakanarray_key_exists()
sukaif( !array_key_exists( 'my_new_column', $mycol ) )
isset()
cek sederhana . Itu tidak menyelesaikan pertanyaan, tetapi lebih baik jika Anda sudah perlu menjalankan kueri pemilihan dan memiliki hasil dalam memori.Saya melemparkan prosedur tersimpan ini bersama-sama dengan mulai dari komentar @ lain di atas, agak menyenangkan jika Anda perlu menyebutnya lebih dari beberapa kali (dan tidak perlu php):
Bekerja dengan
fieldExists
sumber
ExpirationDate
lapangan. 😊Pilih just column_name dari skema informasi dan masukkan hasil dari query ini ke dalam variabel. Kemudian uji variabel untuk memutuskan apakah tabel perlu diubah atau tidak.
PS Jangan foget untuk menentukan TABLE_SCHEMA untuk tabel COLUMNS juga.
sumber
Saya menggunakan skrip sederhana ini:
Ini berfungsi jika Anda sudah terhubung ke database.
sumber
Terima kasih banyak kepada Mfoo yang telah menempatkan skrip yang sangat bagus untuk menambahkan kolom secara dinamis jika tidak ada dalam tabel. Saya telah memperbaiki jawabannya dengan PHP . The Script juga membantu Anda menemukan berapa banyak meja benar-benar diperlukan 'Tambah kolom' perintah mysql. Rasakan saja resepnya. Bekerja seperti pesona.
sumber
Ini bekerja untuk saya dengan sampel PDO:
sumber
JANGAN masukkan ALTER TABLE / MODIFY COLS atau operasi mod tabel lainnya dalam TRANSAKSI. Transaksi adalah untuk dapat mengembalikan kegagalan QUERY bukan untuk PERUBAHAN ... itu akan keluar setiap kali dalam transaksi.
Cukup jalankan kueri SELECT * di atas meja dan periksa apakah kolomnya ada ...
sumber
ALTER
(dan DDL seperti itu) di MySQL memang melakukan (secara implisit) transaksi. Tetapi menggunakan SELECT * akan menghasilkan overhead yang besar dalam jaringan hanya untuk memeriksa keberadaan kolom. Sebagai gantinya Anda mungkin mencobaSELECT my_col_to_check FROM t LIMIT 0
: jika mysql menghasilkan kesalahan, maka kolom mungkin tidak ada (tetap, periksa kesalahan, karena itu mungkin masalah jaringan atau apa pun!); jika tidak ada kesalahan, maka kolom ada. Saya tidak yakin itu cara terbaik untuk memeriksa keberadaan kolom.