我希望使用Laravel模式构建器/迁移在UPDATE CURRENT_TIMESTAMP上创建一个时间戳列,其默认值为CURRENT_TIMESTAMP。我已经浏览了Laravel文档好几次,但我不明白如何将其设置为时间戳列的默认值。
timestamps()
函数为它创建的两个列创建默认值0000-00-000000
。
如果是raw表达式,则应使用db::raw()
将current_timestamp
设置为列的默认值:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
这在每个数据库驱动程序上都是完美无缺的。
新建快捷方式
从Laravel 5.1.25开始(请参阅PR 10962和commit 15C487FE),您可以使用新的usecurrent()
列修饰符方法将current_timestamp
设置为列的默认值:
$table->timestamp('created_at')->useCurrent();
回到这个问题,在MySQL上,您还可以通过db::raw()
使用on update
子句:
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
>
MySQL从MySQL 5.7开始,0000-00-00 00:00:00
不再被视为有效日期。如Laravel5.2升级指南中所述,当您将记录插入数据库时,所有时间戳列都应该收到一个有效的默认值。您可以在迁移中使用usecurrent()
列修饰符(来自Laravel 5.1.25和更高版本)将时间戳列默认为当前时间戳,也可以使时间戳nullable()
允许空值。
PostgreSQL和Laravel 4.x在Laravel 4.x版本中,PostgreSQL驱动程序使用默认的数据库精度来存储时间戳值。当对具有默认精度的列使用currenttimestamp
函数时,PostgreSQL会生成一个具有更高精度的时间戳,从而生成一个具有小数第二部分的时间戳--参见此SQL小提琴。
这将导致Carbon无法解析时间戳,因为它不会期望存储微秒。为了避免这种意外行为破坏应用程序,您必须显式地为current_timestamp
函数指定一个零精度,如下所示:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
自Laravel 5.0以来,timestamp()
列已被更改为使用默认精度为零,从而避免了这种情况。
感谢@andrewhl在评论中指出这个问题。
我试图实现以下所示的功能: 这个代码失败了,因为 类DateTime的对象无法转换为字符串 另一个问题是,我觉得应该有更稳健/优雅的方法来解决这个问题。那么,如何在迁移中正确设置默认的值呢?
我的mysql版本是5.5.41-0Ubuntu0.14.04.1(Ubuntu)
我有一个主要基于CET地区的项目。我在配置/app.php中设置了CET,但是基中的所有枢轴时间戳都存储在UTC时间? 如何设置时间戳的“全局”时区? 我做了这个测试: 结果是这样的: TNX Y
我有一张有数千行的桌子。由于表最初不是在列处使用created_构造的,因此无法获取它们的创建时间戳。不过,开始获取未来行的时间戳是至关重要的。 有没有一种方法可以添加一个带有默认值NOW()的timestamp列,这样它就不会将值填充到以前的行中,而只填充到将来的行中? 如果我执行查询,它将用时间戳填充所有行:
错误1067(42000):“updated”的默认值无效 我想这是因为的精度只有秒。 如何将当前时间设置为具有小数部分的的默认值?
问题内容: 我需要在CURRENT_DATE()列上使用默认值创建mysql表 我尝试 但它写一个错误 问题是什么? 我只需要唯一日期而不需要全职信息… 你能帮助我吗? 问题答案: 使用 CURRENT_TIMESTAMP 函数而不是 CURRENT_DATE() 函数 试试这个: