我需要添加一个新列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);
但我想知道是否有一种方法可以在单个查询中执行此操作,以减少所需的时间并避免锁定.
解决方法:
需要注意的几件事:
这摆脱了ALTER之一:
ALTER TABLE myTable ADD COLUMN basePrice FLOAT(10,2) NOT NULL DEFAULT '0';
UPDATE myTable set basePrice = 0,9 * price;
MySQL 8.0可以立即添加一列. (仍然需要更新.
pt-online-schema-change可以几乎以零锁定时间完成任务.
可以(应该)以1000行为大块来完成UPDATE.每个块将是其自己的事务.这样可以最大程度地减少更新过程中的锁定.更多讨论here.
(我非常同意Strawberry关于使用DECIMAL(8,2)(或任何大小)的交易.)
MySQL 5.7可以有一个“生成的”列,但是我怀疑它不会为您带来任何好处,因为您希望以后更改公式.