如何将@@ system_time_zone定义为MySQL中现有表的列的默认值?

我试图将@@ 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但无济于事.任何人都可以告诉我,如果有正确的语法可以实现这个/任何其他可以实现这一点的替代方案吗?

最佳答案 它是MySQL中的
restriction

数据类型规范中的DEFAULT值子句指示列的默认值.除了一个例外,默认值必须是常量;它不能是一个功能或表达

但是@@和@是用于获取系统或局部变量值的表达式.而且他们不是一成不变的.它们可以在运行时更改.

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

点赞