2016-01-06 115 views
2

我的意思是这样的:我可以将查询指定为字段的默认值吗?

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 = '**/**/****''); 

这样,我插入保存在数据库中的最后一个小节的价值.. 这可能吗?

+2

你需要使用触发器来做到这一点。 –

回答

4

Not directly:

11.7数据类型的默认值

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

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

+0

我很害怕..谢谢! –

4

您可以通过插入前插入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

+0

完全忘了这一点 - 但看到更多的细节或例子会很好。 –

+1

@Pekka웃感谢提醒,我会忘记更新答案。另外,是的,在我开始使用Oracle 10之前,我并不太关心触发器 - 除了触​​发器+序列之外,没有办法在那里创建标识列,这看起来很荒谬,但是让你意识到你有多少事情可以通过操纵任何行动上的任何行来完成。 – Timekiller

相关问题