我正在尝试创建具有类似列的表
model_year smallint(4) not null default YEAR(CURRENT_DATE)
但是有一个错误(无效的默认值)。我可以做些什么来为 model_year 当前年份设置默认值?
我正在尝试创建具有类似列的表
model_year smallint(4) not null default YEAR(CURRENT_DATE)
但是有一个错误(无效的默认值)。我可以做些什么来为 model_year 当前年份设置默认值?
从MySQL 文档页面(我的粗体):
数据类型规范中的
DEFAULT
value 子句指示列的默认值。除了一个例外,默认值必须是一个常量;它不能是函数或表达式。这意味着,例如,您不能将日期列的默认值设置为函数的值,例如NOW()
orCURRENT_DATE
。例外情况是您可以将列指定CURRENT_TIMESTAMP
为默认值TIMESTAMP
。
我怀疑您在插入行时必须指定实际值。
如果您不想这样做,您可以允许 NULL,然后使用另一个进程定期扫描数据库:
update table mytable set model_year = year(current_date) where model_year is null
但这是一个杂乱无章的问题,而且启动起来相当危险,因为会有一段时间列中存在 NULL。
这是您所有查询都必须考虑的事情,导致丑陋,例如:
select a, b, model_year from mytable where model_year is not null
union all
select a, b, year(current_date) from mytable where model_year is null
我自己会走非默认路线。
您将需要一个存储过程(对不起,我不知道 MySQL 语法)。您可以设置一个在 INSERT 或 UPDATE 上触发的存储过程,该过程在模型年份列中查找 NULL 并将其替换为设置模型年份的相同 INSERT 或 UPDATE。