4

我正在尝试将 @@system_time_zone 定义为我尝试添加到现有表的列的默认值。例如

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 TIME_ZONE=@@system_time_zone;

这可行,但很明显这不是一个理想的解决方案。我曾尝试搜索 Google/StackOverFlow,但无济于事。谁能让我知道是否有正确的语法可以实现这个/任何其他可以实现的替代方法?

4

1 回答 1

2

这是MySQL中的限制:

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

但是@@and@是用于获取系统或局部变量值的表达式。而且它们不是恒定的。它们可以在运行时更改。

你的方法很好,但如果你真的想使用系统变量,你可以使用动态 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中成为常量而不是动态变量。如果将来更改时区,此列的默认值将保持不变。

于 2012-10-23T13:04:10.153 回答