假设有一个名为test_table
的MySQL 8.0表,目前没有任何数据,我们想要在某一列之后添加一列created_at
,类型为TIMESTAMP,并设定为记录每行插入时的秒级别时间戳,使用ALGORITHM=INSTANT
进行在线添加列的操作。以下是测试案例:
-- 首先,创建一个测试表
CREATE TABLE `test_table1` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(100),
`email` VARCHAR(100)
) ENGINE=InnoDB;
-- 插入一些测试数据(假设已有)
INSERT INTO `test_table1` (`name`, `email`) VALUES
('User1', '[email protected]'),
('User2', '[email protected]');
-- 开始测试案例:在线添加一列`created_at`,并设定默认值为当前时间(秒级别)
SET SESSION sql_mode = 'ALLOW_INVALID_DATES'; -- 允许未来的日期
BEGIN;
ALTER TABLE `test_table1`
ADD COLUMN `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间' AFTER `email`,
ALGORITHM=INSTANT;
COMMIT;
ALTER TABLE `test_table1` ADD COLUMN `device_id` varchar(128) NOT NULL DEFAULT '' COMMENT '设备id' AFTER `name`, algorithm=instant;
ALTER TABLE `test_table1` ADD COLUMN `device_id1` varchar(128) NOT NULL DEFAULT '' COMMENT '设备id' AFTER `name`,
ADD INDEX `idx_cdkey_deviceid`(`email` ASC, `device_id1` ASC) USING BTREE, algorithm=instant;
ALTER TABLE `underground_server`.`user_cdkey` ADD COLUMN `device_id` varchar(128) NOT NULL DEFAULT '' COMMENT '设备id' AFTER `user_name`,
ADD INDEX `idx_cdkey_deviceid`(`cdkey` ASC, `device_id` ASC) USING BTREE, algorithm=instant;
-- 验证添加列结果
DESCRIBE `test_table1`;
SELECT * FROM `test_table`;
-- 清理测试数据
TRUNCATE TABLE `test_table`;
注意事项:
CURRENT_TIMESTAMP(0)
指定了精度为秒级的时间戳。- 使用
BEGIN
和COMMIT
包裹DDL操作是为了模拟事务环境下的在线DDL。 - 虽然在这个简单的例子中我们试图使用
ALGORITHM=INSTANT
,但在实际操作中,MySQL是否能成功使用INSTANT
算法还需视具体情况而定,特别是表中的已有数据量、表结构和MySQL服务器的配置。
如果在实际环境中执行上述操作时依然收到类似"1845 - ALGORITHM=INSTANT is not supported"的错误,说明此操作无法使用INSTANT
算法,应移除该选项或改用其他支持的算法。