Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Ubah tipe data kolom di MySQL tanpa kehilangan metadata lainnya (DEFAULT, NOTNULL...)

Seperti yang dinyatakan dalam halaman manual , ALTER TABLE mengharuskan semua atribut tipe baru untuk didefinisikan.

Namun, ada cara untuk mengatasi hal tersebut. Anda dapat menggunakan INFORMATION_SCHEMA meta-data untuk merekonstruksi ALTER yang diinginkan pertanyaan. misalnya, jika kita memiliki tabel sederhana:

mysql> DESCRIBE t;
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| value | varchar(255)     | NO   |     | NULL    |                |
+-------+------------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)

maka kita dapat mereproduksi pernyataan alter kita dengan:

SELECT 
  CONCAT(
    COLUMN_NAME, 
    ' @new_type', 
    IF(IS_NULLABLE='NO', ' NOT NULL ', ' '), 
    EXTRA
  ) AS s
FROM 
  INFORMATION_SCHEMA.COLUMNS 
WHERE 
  TABLE_SCHEMA='test' 
  AND 
  TABLE_NAME='t'

hasilnya adalah:

+--------------------------------------+
| s                                    |
+--------------------------------------+
| id @new_type NOT NULL auto_increment |
| value @new_type NOT NULL             |
+--------------------------------------+

Di sini saya telah meninggalkan @new_type untuk menunjukkan bahwa kita dapat menggunakan variabel untuk itu (atau bahkan mengganti tipe baru kita secara langsung ke kueri). Dengan variabel yang akan menjadi:

  • Tetapkan variabel kami.

    mysql> SET @new_type := 'VARCHAR(10)', @column_name := 'value';
    Query OK, 0 rows affected (0.00 sec)
    
  • Siapkan variabel untuk pernyataan yang disiapkan (ini pertanyaan yang panjang, tapi saya meninggalkan penjelasan di atas):

    SET @sql = (SELECT CONCAT('ALTER TABLE t CHANGE `',COLUMN_NAME, '` `', COLUMN_NAME, '` ', @new_type, IF(IS_NULLABLE='NO', ' NOT NULL ', ' '), EXTRA) AS s FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t' AND [email protected]_name);
    
  • Siapkan pernyataan:

    mysql> prepare stmt from @sql;
    Query OK, 0 rows affected (0.00 sec)
    Statement prepared
    
  • Terakhir, jalankan:

    mysql> execute stmt;
    Query OK, 0 rows affected (0.22 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    

Kemudian kita akan mengubah tipe data kita menjadi VARCHAR(10) dengan menyimpan semua penentu lainnya:

mysql> DESCRIBE t;
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| value | varchar(10)      | NO   |     | NULL    |                |
+-------+------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menambahkan data ke bidang database MySQL yang sudah memiliki data di dalamnya

  2. Lanjutkan kueri SQL bahkan pada kesalahan di meja kerja MySQL

  3. Bagaimana cara meminta javascript menunggu mysql menetapkan nilai ke variabel php?

  4. ekstensi java.sql.Connection untuk SSH

  5. Menghitung entri terkait dengan Sequelize