Symfony Doctrine执行schema:update时datetime字段默认值报错
问题原因
MySQL 5.7中,当DATETIME(6)(带微秒精度)字段设置DEFAULT CURRENT_TIMESTAMP(秒精度)时,会因精度不匹配触发1067 Invalid default value错误。Doctrine生成的SQL里,liked_date_time字段是DATETIME(6)但默认值用了不带微秒的CURRENT_TIMESTAMP,导致规则冲突。此外,若MySQL启用了STRICT_TRANS_TABLES、NO_ZERO_DATE这类严格模式,会进一步放大该问题。
解决方案
方案1:匹配默认值与字段精度
修改实体注解,将默认值改为带微秒的CURRENT_TIMESTAMP(6),和字段的DATETIME(6)精度保持一致:
/** * @var \DateTime * @ORM\Column(type="datetime", options={"default":"CURRENT_TIMESTAMP(6)"}) */ private $likedDateTime;
方案2:禁用Doctrine的datetime微秒精度
在Symfony的Doctrine配置文件(config/packages/doctrine.yaml)中,设置DBAL平台选项,让datetime类型不生成微秒精度的字段:
doctrine: dbal: # 保留原有其他配置 platform_options: use_datetime_with_microseconds: false
方案3:调整MySQL的sql_mode(临时应急)
临时关闭严格模式相关参数,执行schema更新后再恢复原有配置:
SET GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
执行完php bin/console doctrine:schema:update --force后,建议恢复之前的sql_mode设置。
内容的提问来源于stack exchange,提问作者noname
相关产品推荐
相关产品推荐

