【问题标题】:Add column and set value添加列并设置值
【发布时间】:2018-11-08 13:43:51
【问题描述】:

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

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

【问题讨论】:

  • 请注意,与钱有关的事情通常不是 FLOAT;这就是发明 DECIMAL 的原因。
  • 我可能会使用视图或触发器来完成此操作

标签: mysql locking alter


【解决方案1】:

注意几点:

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

【讨论】:

    猜你喜欢
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 2022-07-30
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多