Както е посочено в страница с ръководство
, 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)