我应该如何用其他两列的平均值更新 MySQL 表列?

Posted

技术标签:

【中文标题】我应该如何用其他两列的平均值更新 MySQL 表列?【英文标题】:How should I update a MySQL table column with the average of other two columns? 【发布时间】:2020-12-04 13:44:04 【问题描述】:

我有一个包含以下列的表:id (AI, PK), name, surname, group, grade1, grade2, average,我必须从 php 脚本中将 'grade1''grade2' 的平均值插入到 'average' 列中。

我用过:

INSERT INTO `table_name`(`average`) SELECT AVG((`grade1` + `grade2`)/2.0) FROM table_name GROUP BY `id`

我插入了成绩,但不知何故,当我运行 SQL 语句时,它只使用平均值创建新行。我需要更新现有行中的“平均”列,而不是创建新行。

提前谢谢你!

【问题讨论】:

【参考方案1】:

你似乎想要update,而不是insert

update table_name
    set average = (grade1 + grade2) / 2;

我应该注意,拥有这样一个计算列是危险的,因为它可能会不同步。生成的列要安全得多,您可以将其表示为:

alter table table_name add column average decimal(10, 2)
    generated always as ( (grade1 + grade2) / 2);

这是在值被查询时计算的,因此它始终是最新的。

【讨论】:

它是这样工作的,但是如果我插入带有成绩和姓名的新学生,我必须删除平均列以便再次更新它,并且我需要对平均列执行几个操作。 @丹尼尔。 . .这通过建议计算列来解决这个问题。而且您不必“删除”列来更新新值或维护计算列,所以我不知道“删除”指的是什么。【参考方案2】:

您应该使用UPDATE ... WHERE ... 而不是INSERT INTO ...

我也会考虑使用触发器而不是使用 PHP。

【讨论】:

以上是关于我应该如何用其他两列的平均值更新 MySQL 表列?的主要内容,如果未能解决你的问题,请参考以下文章

根据其他列的名称计算熊猫的平均值[重复]

连接两个表列并用结果更新一个

如何更改 mysql 表列的默认值?

是否可以隐式获取表列的最后更新时间戳?

如何用python中其他数据帧中的条目替换一个数据帧中列的丢失条目?

按一对多相关表列的平均值排序