wzljy

博客园 首页 新随笔 联系 订阅 管理

假设有一个名为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', 'user1@example.com'),
('User2', 'user2@example.com');

-- 开始测试案例:在线添加一列`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)指定了精度为秒级的时间戳。
  • 使用BEGINCOMMIT包裹DDL操作是为了模拟事务环境下的在线DDL。
  • 虽然在这个简单的例子中我们试图使用ALGORITHM=INSTANT,但在实际操作中,MySQL是否能成功使用INSTANT算法还需视具体情况而定,特别是表中的已有数据量、表结构和MySQL服务器的配置。

 

如果在实际环境中执行上述操作时依然收到类似"1845 - ALGORITHM=INSTANT is not supported"的错误,说明此操作无法使用INSTANT算法,应移除该选项或改用其他支持的算法。

posted on 2024-02-23 09:35  Nuyoahlili~  阅读(50)  评论(0编辑  收藏  举报