我需要添加一个新列 NOT NULL,其值应与其他字段成比例。现在比例是一样的,以后可能会不一样
现在我的当前脚本
ALTER TABLE myTable ADD COLUMN (basePrice FLOAT(10,2) NULL);
UPDATE myTable set basePrice = 0,9 * price;
ALTER TABLE myTable MODIFY COLUMN (basePrice FLOAT(10,2) NOT NULL);
但我想知道是否有一种方法可以在单个查询中执行此操作以减少所需时间并避免锁定。
最佳答案
注意几点:
这摆脱了其中一个 ALTERs:
ALTER TABLE myTable ADD COLUMN basePrice FLOAT(10,2) NOT NULL DEFAULT '0';
UPDATE myTable set basePrice = 0,9 * price;
MySQL 8.0 基本上可以立即添加列。 (仍然需要 UPDATE
。
pt-online-schema-change
可以以几乎零锁定时间完成任务。
UPDATE
可以(应该)以 1000 行的 block 的形式完成。每个 block 都是它自己的事务。这最大限度地减少了更新期间的锁定。更多讨论 here .
(我非常同意 Strawberry 关于使用 DECIMAL(8,2)
(或任何大小)来赚钱。)
MySQL 5.7 可以有一个“生成的”列,但我怀疑它不会给您带来任何好处,因为您希望稍后更改公式。
关于mysql - 添加列和设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53208998/