添加列并设置值

时间:2018-11-08 13:43:51

标签: mysql locking alter

我需要添加一个新列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);

但是我想知道是否有一种方法可以在单个查询中执行此操作,以减少所需的时间并避免锁定。

1 个答案:

答案 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可以有一个“生成的”列,但是我怀疑它不会为您带来任何好处,因为您希望以后更改公式。