【问题标题】:Can I specify a query as a field's default value?我可以将查询指定为字段的默认值吗?
【发布时间】:2016-04-10 11:22:53
【问题描述】:

我的意思是这样的:

create table Measures (
id_user int,
date timestamp,
measure_1 double default 'select measure_1 from Measures where data = '**/**/****'',
measure_2 double default 'select measure_1 from Measures where data = '**/**/****'');

通过这种方式,我插入了保存在数据库中的最后一个度量的值.. 有可能吗?

【问题讨论】:

  • 您需要使用触发器来执行此操作。

标签: mysql sql database field


【解决方案1】:

Not directly:

11.7 数据类型默认值

...默认值必须是常量;它不能是函数或表达式。

您必须在应用程序级别或@Timekiller 建议的触发器中执行此操作。

【讨论】:

    【解决方案2】:

    您可以通过插入前的trigger 来做到这一点。

    检查NEW.measure_1是否为空,如果是,则执行选择并存储结果。

    UPD:

    对了,昨天有点赶时间,后面忘记举例了。触发器是复杂默认值的一个很好的替代品——它将透明地工作,看起来就像从数据库用户的角度来看的默认值,并且您不必在应用程序级别上做任何事情,因为触发器存储在数据库本身中。它看起来像这样:

    CREATE TRIGGER `measures_bi_trigger` BEFORE INSERT ON `Measures`
     FOR EACH ROW BEGIN
    if NEW.measure_1 is null then
      SET NEW.measure_1 = (select measure_1 from Measures where ... limit 1);
    end if;
    if NEW.measure_2 is null then
      SET NEW.measure_2 = (select measure_2 from Measures where ... limit 1);
    end if;
    END
    

    尚不清楚您的where 条件中应该包含什么,因此您必须自己替换...。请注意,您的查询应该只返回一行,因此请使用 MAXorder by ... limit 1 之类的聚合函数。如果您的查询没有返回任何行,则将插入NULL

    【讨论】:

    • 完全忘记了这一点 - 不过看到更多细节或示例会很好。
    • @Pekka웃 感谢提醒,我会忘记更新答案的。另外,是的,在我开始使用 Oracle 10 之前,我也不太关心触发器 - 除了使用触发器+序列外,没有办法在那里创建标识列,这起初看起来很荒谬,但让你意识到你有多少事情可以通过在任何操作上操作任何行来完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 2017-03-09
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 2012-11-26
    相关资源
    最近更新 更多