2012-10-23 34 views
4

我想將@@ system_time_zone定義爲我想要添加到現有表的列的默認值。 例如如何將@@ system_time_zone定義爲MySQL中現有表的列的默認值?

ALTER TABLE T1 ADD COLUMN TIME_ZONE CHAR(64) NOT NULL DEFAULT @@system_time_zone; 

這會引發MySQL語法錯誤。我嘗試在單引號內附上@@ system_time_zone。我現在把它分成兩部分,如下所示:

ALTER TABLE T1 ADD COLUMN TIME_ZONE CHAR(64) NOT NULL; 

UPTATE T1 SET [email protected]@system_time_zone; 

這很有效,但很明顯這不是一個理想的解決方案。我試圖搜索谷歌/ StackOverFlow但無濟於事。任何人都可以讓我知道,如果有一個正確的語法,可以實現這個/任何其他的替代方法,這可以實現?

回答

2

這是在MySQL中restriction

The DEFAULT value clause in a data type specification indicates a default value for a column. With one exception, the default value must be a constant; it cannot be a function or an expression

@@@是這是用來獲取系統或局部變量值的表達式。它們並不是恆定的。它們可以在運行時改變。

你的做法是好的,但如果你真的想使用系統變量,您可以使用動態SQL這樣的:

set @q = concat('alter table t1 add column time_zone char(64) not null default ', quote(@@system_time_zone)); 

prepare stmt from @q; 
execute stmt; 
deallocate prepare stmt; 

每@lanzz建議: 在過去的代碼塊@@system_time_zone反而成爲動態的常數變量。如果時區將在未來的默認值更改此列將保持不變。

+0

您可能需要在語句末尾添加尾隨空格(在'not null default'後面);也可以指出,採用這種方法時,默認值是在創建table_時的當前系統時區,而不是在插入表格時;即如果您以後更改系統時區,列默認仍將是舊系統時區。 – lanzz

+0

@lanzz,這是真的。因爲它變成了一個常數。 – ravnur

+0

我知道這是,我正試圖幫助你改善你的答案,爲未來的讀者帶來益處。在實際應答體中包含該警告將是一件好事,因爲OP可能希望始終將當前系統時區作爲該列的默認值。 – lanzz

相關問題