我有一个超过50,000个日期的表,我需要将其转换为Timestamp字段。
基本表格布局:
Fieldname Type
+------------------------+-----------+
| calendar_date | DATE |
| calendar_unixtimestamp | TIMESTAMP |
+------------------------+-----------+
基本上是这样的:
update calender set calendar_unixtimestamp = UNIX_TIMESTAMP(calendar_date)
但是,当然不会工作。所以我尝试了另一个在一些愚蠢的网站上告诉我的选项,似乎合乎逻辑。但无法让它发挥作用:
update
calendar t1
join calendar t2 on t2.`calendar_date` = t1.`calendar_date`
set
t1.calendar_unixtimestamp = UNIX_TIMESTAMP(t2.`calendar_date`)
where
t1.`calendar_date` = t2.`calendar_date`
任何?
答案 0 :(得分:0)
答案 1 :(得分:0)
本杰明。
我不是mysql的专家,但我认为你应该读这个:
http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html
特别是当它说:
默认情况下,如果两者都没有明确指定,则第一个TIMESTAMP列同时具有DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP。
on UPDATE子句会在记录更新时将字段值更改为当前时间戳,因此您更新它,然后它会自动更改为当前时间戳,对于您的所有记录都相同(或几乎)表
也许你需要的是DATETIME专栏。时间戳列用于在创建和/或更新记录时进行注册。这可用于许多目的,包括多个用户尝试更新同一记录时的安全性或冲突解决方案。
a)如果这是你需要的,你应该首先禁用ON UPDATE触发器,然后进行更新(你的第一个是OK),然后重新创建触发器(*)。只需添加一个WHERE条件,以确保您不尝试更新空值。同样,我不确定unix_timestamp是否是您需要的功能。
UPDATE calendar
SET calendar_timestamp = TIMESTAMP(calendar.date)
WHERE calendar_date IS NOT NULL
b)如果不是,您只需将新列的类型更改为DATETIME。
(*)注意:删除列可能更容易,然后使用DEFAULT子句创建它,但不使用ON UPDATE,或者指定NULL子句。