mysql - 添加列和设置值

标签 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);

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

最佳答案

注意几点:

这摆脱了其中一个 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/

相关文章:

jenkins - 有没有办法模拟 Jenkins 管道作业的读写锁?

sql - redshift 改变 udf 更改所有者

php - MySQL PDO 多选

php - 形成新闻副本

mysql - Magento,修改 Zend_Db_Select SET group_concat_max_len

mysql - 在 A 之前订购 AA

MySQL - 检测和处理存储过程中的锁等待超时

mysql - 如何优先处理某些查询?

php - 为 MySql 中的所有表设置自动增量值

mysql - 更改表以在特定列之前添加列