Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Thay đổi kiểu dữ liệu cột trong MySQL mà không làm mất siêu dữ liệu khác (DEFAULT, NOTNULL ...)

Như đã nêu trong trang thủ công , ALTER TABLE yêu cầu tất cả các thuộc tính kiểu mới phải được xác định.

Tuy nhiên, có một cách để khắc phục điều này. Bạn có thể sử dụng INFORMATION_SCHEMA siêu dữ liệu để tạo lại ALTER mong muốn truy vấn. ví dụ:nếu chúng ta có bảng đơn giản:

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)

thì chúng ta có thể tái tạo câu lệnh thay thế của mình bằng:

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'

kết quả sẽ là:

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

Đây, tôi đã để lại @new_type để chỉ ra rằng chúng tôi có thể sử dụng biến cho điều đó (hoặc thậm chí thay thế trực tiếp kiểu mới của chúng tôi để truy vấn). Với biến đó sẽ là:

  • Đặt các biến của chúng tôi.

    mysql> SET @new_type := 'VARCHAR(10)', @column_name := 'value';
    Query OK, 0 rows affected (0.00 sec)
    
  • Chuẩn bị biến cho câu lệnh đã chuẩn bị (đó là truy vấn dài, nhưng tôi đã để lại các giải thích ở trên):

    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);
    
  • Chuẩn bị tuyên bố:

    mysql> prepare stmt from @sql;
    Query OK, 0 rows affected (0.00 sec)
    Statement prepared
    
  • Cuối cùng, hãy thực thi nó:

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

Sau đó, chúng tôi sẽ thay đổi kiểu dữ liệu của mình thành VARCHAR(10) với việc lưu tất cả các chỉ số còn lại:

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. viết một truy vấn áp dụng cho toàn bộ db thay vì một bảng

  2. Tạo truy vấn động trong MySQL thủ tục được lưu trữ

  3. Sử dụng PHP DOM để tạo tệp XML từ dữ liệu MySQL

  4. Cài đặt Máy chủ Web trong FreeBSD 6.0 với Apache 2.2, MySQL 5.0 và PHP 5 - Phần 3

  5. Thay đổi giới hạn cho kích thước Hàng Mysql quá lớn