【问题标题】:Is it possible to set the standard value of a column to the value of another column?是否可以将一列的标准值设置为另一列的值?
【发布时间】:2020-11-06 23:43:20
【问题描述】:

我希望 B 列的标准值是同一行中 A 列的值,直到通过用户触发的 UPDATE 更改它。这可能吗?

我正在使用 Mysql 8 和 phpmyadmin,如果这很重要的话。

【问题讨论】:

  • 您如何区分用户触发的更新与任何其他更新?在 sql update 是一个更新,mysql 无法分辨是谁或什么发布了它。在应用层处理这个可能会更好。话虽如此,如果非用户发出的插入/更新从未设置 B 列,但用户触发的插入/更新总是这样做,那么使用插入/更新之前的触发器,您可以检测到这一点并设置 B 列的值。
  • 好吧,作为 phpmyadmin,让我在创建行时将标准值定义为硬编码值,我想也许有一种方法可以轻松地将其指向另一列。如果没有,我只需要在应用程序级别解决这个问题,这没什么大不了的。只是想尝试更好地学习和理解数据库......
  • 重复Shadow 所说的,只是为了确保您理解它:您使用了“用户触发更新”一词。您可以有意使用它,因为您想区分用户明确完成的更新和系统完成的更新。或者您可以使用它,因为它听起来不错,而您的意思是“任何更新”。第一个版本使它更复杂(正如 Shadow 所阐述的那样),第二个版本根本不是(它是一个简单的插入触发器,尽管根据您的应用程序,最好手动设置该列)。你也许应该澄清这一点。
  • 好的,澄清一下,我的意思是在最初创建行后更改值的任何更新。我使用了用户触发一词,因为这会导致我的应用程序更新,但本质上是任何更新.
  • 在这种情况下,您确实可以简单地使用“插入前”触发器,请参阅mysql set field default value to other column(例外:使用自动增量值)

标签: mysql sql


【解决方案1】:

MySQL 不允许您使用带有其他列的表达式来默认值。

一种解决方案是在表上使用insert 触发器将B 设置为A。但是,如果 A 发生变化,这不会跟踪 - 除非您有 update 触发器。但是您不知道何时手动设置B。哦,这很难跟踪。

您可以使用计算列执行其他操作——假设您永远不希望将B 手动设置为NULL。这看起来像:

create table t as (
     . . . ,
     a int not null,
     _b int,
     b int generated always as (coalesce(_b, a))
);

然后,在您的代码中,您使用b 进行查询。当你想设置值时,你可以设置_b的值。

当然,您可以将此扩展为具有一个布尔标志,用于判断a_b 是否用于b。但是,使用NULL来区分是否设置了值说明了这个想法并且更简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 2018-03-15
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-14
    相关资源
    最近更新 更多