Mysql
 sql >> база данни >  >> RDS >> Mysql

Променете типа данни на колона в MySQL, без да губите други метаданни (ПО ПОДРАЗБИРАНЕ, NOTNULL...)

Както е посочено в страница с ръководство , ALTER TABLE изисква всички нови атрибути на типа да бъдат дефинирани.

Въпреки това, има начин да се преодолее това. Можете да използвате INFORMATION_SCHEMA мета-данни за да реконструирате желания ALTER запитване. например, ако имаме проста таблица:

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)

тогава можем да възпроизведем нашия alter израз с:

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'

резултатът би бил:

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

Тук оставих @new_type за да посочим, че можем да използваме променлива за това (или дори да заменим нашия нов тип директно в заявката). С променлива това би било:

  • Задайте нашите променливи.

    mysql> SET @new_type := 'VARCHAR(10)', @column_name := 'value';
    Query OK, 0 rows affected (0.00 sec)
    
  • Подгответе променлива за подготвено изявление (това е дълга заявка, но съм оставил обяснения по-горе):

    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);
    
  • Подгответе изявление:

    mysql> prepare stmt from @sql;
    Query OK, 0 rows affected (0.00 sec)
    Statement prepared
    
  • Накрая го изпълнете:

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

След това ще променим нашия тип данни на VARCHAR(10) със запазване на всички останали спецификатори:

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. MySQL C++ Connector неразрешен външен символ _get_driver_instance

  2. Как мога да търся по емоджи в MySQL, използвайки utf8mb4?

  3. Как мога да вмъкна данни в MySQL база данни?

  4. proxysql-admin Алтернативи - ClusterControl ProxySQL GUI

  5. Съхранената процедура на MySQL вмъква няколко реда от списъка