Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 是否可以将一列的标准值设置为另一列的值?_Mysql_Sql - Fatal编程技术网

Mysql 是否可以将一列的标准值设置为另一列的值?

Mysql 是否可以将一列的标准值设置为另一列的值?,mysql,sql,Mysql,Sql,我希望B列的标准值是同一行中A列的值,直到通过用户触发的更新进行更改。可能吗 如果有必要的话,我使用的是Mysql 8和phpmyadmin。Mysql不允许使用表达式和其他列来默认值 一种解决方案是在表上插入触发器,将B设置为A。但是,如果A发生了变化,这将无法跟踪——除非您有update触发器。但是您不知道何时手动设置了B。哦,这很难跟踪 您可以使用计算列执行其他操作——假设您不希望将B手动设置为NULL。这看起来像: create table t as ( . . . ,

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


如果有必要的话,我使用的是Mysql 8和phpmyadmin。

Mysql不允许使用表达式和其他列来默认值

一种解决方案是在表上插入触发器,将
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
进行查询。当您想要设置值时,可以设置
\u b
的值


当然,您可以对其进行扩展,以便在
a
\u b
用于
b
时使用布尔标志。但是,使用
NULL
来区分是否设置了值说明了这一想法,而且更简单。

如何区分用户触发的更新和任何其他更新?在sql更新是一种更新的情况下,mysql无法判断是谁或是什么发布了它。最好在应用程序层处理这个问题。话虽如此,如果非用户发布的insert/updates从未设置B列,但用户触发的insert/updates始终设置B列,那么使用before insert/update触发器可以检测到这一点并设置B列的值。好的,作为phpmyadmin,让我在创建行时定义一个标准值作为硬编码值,我想也许有一种方法可以很容易地把它指向另一个专栏。如果没有,我只需要在应用程序级别解决这个问题,这没什么大不了的。只是想更好地学习和理解数据库……重复Shadow所说的,只是为了确保您理解它:您使用了术语“用户触发的更新”。您可能有意使用此选项,因为您希望区分由用户显式完成的更新和由系统完成的更新。或者你可以用它,因为它听起来不错,你只是说“任何更新”。第1个版本使它变得更复杂(正如Shadow所阐述的),第2个版本则完全不是(它是一个简单的插入触发器,尽管根据应用程序的不同,手动设置该列可能更好)。您可能应该澄清这一点。好的,澄清一下,我指的是在最初创建行后更改值的任何更新。我使用了术语“用户触发”,因为这会导致我的应用程序中出现更新,但本质上是任何更新。在这种情况下,您确实可以使用“插入前”触发器,请参阅(例外:使用自动增量值)