我需要添加一个新列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);
但是我想知道是否有一种方法可以在单个查询中执行此操作,以减少所需的时间并避免锁定。
答案 0 :(得分:3)
需要注意的几件事:
这摆脱了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行为大块。每个块将是其自己的事务。这样可以最大程度地减少更新过程中的锁定。更多讨论here。
(我非常坚决同意Strawberry关于使用DECIMAL(8,2)
(或任何大小)的金钱。)
MySQL 5.7可以有一个“生成的”列,但是我怀疑它不会为您带来任何好处,因为您希望以后更改公式。