2016-01-06 120 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

相關問題