Добавить столбец и установить значение - PullRequest
0 голосов
/ 08 ноября 2018

Мне нужно добавить новый столбец 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 голосов
/ 14 ноября 2018

Несколько замечаний:

Это избавляет от одного из 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 строк. Каждый кусок будет отдельной транзакцией. Это минимизирует блокировки во время обновления. Больше обсуждения здесь .

(И я полностью согласен со Strawberry в использовании DECIMAL(8,2) (или любого другого размера) для денег.)

MySQL 5.7 может иметь «сгенерированный» столбец, но я подозреваю, что он ничего не купит, так как вы ожидаете изменить формулу позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...