Penelitian dan eksperimen saya belum membuahkan jawaban, jadi saya mengharapkan bantuan.
Saya memodifikasi file instal aplikasi yang di versi sebelumnya tidak memiliki kolom yang ingin saya tambahkan sekarang. Saya tidak ingin menambahkan kolom secara manual, tetapi di file instalasi dan hanya jika kolom baru belum ada di tabel.
Tabel dibuat sebagai berikut:
CREATE TABLE IF NOT EXISTS `#__comm_subscribers` (
`subscriber_id` int(11) NOT NULL auto_increment,
`user_id` int(11) NOT NULL default '0',
`subscriber_name` varchar(64) NOT NULL default '',
`subscriber_surname` varchar(64) NOT NULL default '',
`subscriber_email` varchar(64) NOT NULL default '',
`confirmed` tinyint(1) NOT NULL default '0',
`subscribe_date` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`subscriber_id`),
UNIQUE KEY `subscriber_email` (`subscriber_email`)
) ENGINE=MyISAM CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' COMMENT='Subscribers for Comm are stored here.';
Jika saya menambahkan yang berikut ini, di bawah pernyataan buat tabel, maka saya tidak yakin apa yang terjadi jika kolom tersebut sudah ada (dan mungkin terisi):
ALTER TABLE `#__comm_subscribers` ADD `subscriber_surname`;
ALTER TABLE `#__comm_subscribers` MODIFY `subscriber_surname` varchar(64) NOT NULL default '';
Jadi, saya mencoba yang berikut yang saya temukan di suatu tempat. Ini sepertinya tidak berhasil tetapi saya tidak sepenuhnya yakin saya menggunakannya dengan benar.
/*delimiter '//'
CREATE PROCEDURE addcol() BEGIN
IF NOT EXISTS(
SELECT * FROM information_schema.COLUMNS
WHERE COLUMN_NAME='subscriber_surname' AND TABLE_NAME='#__comm_subscribers'
)
THEN
ALTER TABLE `#__comm_subscribers`
ADD COLUMN `subscriber_surname` varchar(64) NOT NULL default '';
END IF;
END;
//
delimiter ';'
CALL addcol();
DROP PROCEDURE addcol;*/
Adakah yang punya cara yang baik untuk melakukan ini?
Jawaban:
Perhatikan bahwa
INFORMATION_SCHEMA
tidak didukung di MySQL sebelum 5.0. Prosedur tersimpan juga tidak didukung sebelum 5.0, jadi jika Anda perlu mendukung MySQL 4.1, solusi ini tidak baik.Salah satu solusi yang digunakan oleh framework yang menggunakan migrasi database adalah mencatat dalam database Anda nomor revisi untuk skema. Hanya tabel dengan satu kolom dan satu baris, dengan bilangan bulat yang menunjukkan revisi mana yang sedang berlaku. Saat Anda memperbarui skema, tambahkan angkanya.
Solusi lain akan hanya mencoba yang
ALTER TABLE ADD COLUMN
perintah. Ini harus memunculkan kesalahan jika kolom sudah ada.Tangkap kesalahan dan abaikan dalam skrip peningkatan Anda.
sumber
--force
sakelar, yang berarti terus berjalan meskipun ada kesalahan. lalu, lakukan saja. Anda hanya ingin memastikan bahwa tidak ada pernyataan yang TIDAK Anda inginkan untuk berhasil jika sesuatu yang sebelumnya gagal.Berikut adalah solusi yang berfungsi (baru saja mencoba dengan MySQL 5.0 di Solaris):
Sekilas mungkin terlihat lebih rumit dari yang seharusnya, tetapi kita harus mengatasi masalah berikut di sini:
IF
pernyataan hanya bekerja dalam prosedur yang tersimpan, tidak ketika dijalankan secara langsung, misalnya di klien mysqlSHOW COLUMNS
tidak berfungsi dalam prosedur tersimpan jadi harus menggunakan INFORMATION_SCHEMATABLE_SCHEMA=DATABASE()
.DATABASE()
mengembalikan nama database yang saat ini dipilih.sumber
Jika Anda menggunakan MariaDB, tidak perlu menggunakan prosedur tersimpan. Gunakan saja, misalnya:
Lihat disini
sumber
Sebagian besar jawaban membahas cara menambahkan kolom dengan aman dalam prosedur yang tersimpan, saya harus menambahkan kolom ke tabel dengan aman tanpa menggunakan proc yang disimpan dan menemukan bahwa MySQL tidak mengizinkan penggunaan
IF Exists()
luar SP . Saya akan memposting solusi saya yang mungkin membantu seseorang dalam situasi yang sama.sumber
Cara lain untuk melakukannya adalah dengan mengabaikan kesalahan dengan
declare continue handler
:Saya pikir cara ini lebih rapi daripada dengan
exists
subquery. Terutama jika Anda memiliki banyak kolom untuk ditambahkan, dan Anda ingin menjalankan skrip beberapa kali.info lebih lanjut tentang penangan lanjut dapat ditemukan di http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html
sumber
Saya menggunakan MySQL 5.5.19.
Saya suka memiliki skrip yang dapat Anda jalankan dan jalankan kembali tanpa kesalahan, terutama di mana peringatan tampaknya tetap ada, muncul lagi nanti saat saya menjalankan skrip yang tidak memiliki kesalahan / peringatan. Sejauh menambahkan bidang, saya menulis sendiri prosedur untuk membuatnya sedikit lebih sedikit mengetik:
Kode untuk membuat prosedur addFieldIfNotExists adalah sebagai berikut:
Saya tidak menulis prosedur untuk mengubah kolom dengan aman, tapi menurut saya prosedur di atas dapat dengan mudah dimodifikasi untuk melakukannya.
sumber
Saya telah mengambil sproc OP dan membuatnya dapat digunakan kembali dan skema independen. Jelas masih membutuhkan MySQL 5.
sumber
Baru saja mencoba skrip prosedur tersimpan. Sepertinya masalahnya adalah
'
tanda di sekitar pembatas. The MySQL Docs menunjukkan bahwa karakter pembatas tidak perlu tanda kutip tunggal.Jadi Anda ingin:
Dari pada:
Bekerja untuk saya :)
sumber
Jika Anda menjalankan ini dalam skrip, Anda akan ingin menambahkan baris berikut setelah itu untuk membuatnya dapat dibuka kembali, jika tidak Anda mendapatkan kesalahan prosedur sudah ada.
sumber
Cara terbaik untuk menambahkan kolom di PHP> PDO:
Catatan: kolom pada tabel tidak dapat diulang, artinya kita tidak perlu memeriksa keberadaan kolom, tetapi untuk menyelesaikan masalah kita periksa kode di atas:
misalnya jika berfungsi alert 1, jika bukan 0, artinya kolom tersebut ada! :)
sumber
Periksa apakah Kolom Ada atau tidak di PDO (100%)
sumber
Prosedur dari Jake https://stackoverflow.com/a/6476091/6751901 adalah solusi yang sangat sederhana dan bagus untuk menambahkan kolom baru, tetapi dengan satu baris tambahan:
Anda dapat menambahkan kolom baru nanti di sana, dan ini akan berfungsi di lain waktu:
sumber
Kemudian di $ res by cycle cari kunci kolom anda Smth seperti ini:
sumber
SHOW fields FROM __TABLE__NAME__ where field='_my_col_';
dan kemudian memeriksa hasil yang ditetapkan tidak kosongDi bawah ini adalah prosedur Tersimpan di MySQL Untuk Menambahkan Kolom di Tabel yang berbeda di Database yang berbeda jika kolom tidak ada di Tabel Database dengan keuntungan sebagai berikut
sumber
sumber