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)