记录几个常用的MySQL函数:
LAST_INSERT_ID([expr])
自动返回最后一个INSERT或 UPDATE 问询为 AUTO_INCREMENT列设置的第一个发生的值。
如果一次性insert多条数据,只返回第一个数据的主键。mysql> SELECT * FROM t;
+----+------+
| id | name |
| 1 | Bob |
+----+------+
mysql> INSERT INTO t VALUES (NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa');
mysql> SELECT * FROM t;
+----+------+
| id | name |
| 1 | Bob |
| 2 | Mary |
| 3 | Jane |
| 4 | Lisa |
+----+------+
mysql> SELECT LAST_INSERT_ID();
->2;
注:假如你使用 INSERT IGNORE而记录被忽略,则AUTO_INCREMENT 计数器不会增量,而 LAST_INSERT_ID() 返回0,这反映出没有插入任何记录。
若给出作为到LAST_INSERT_ID()的参数expr ,则参数的值被函数返回,并作为被LAST_INSERT_ID()返回的下一个值而被记忆。这可用于模拟序列:
mysql> CREATE TABLE sequence (id INT NOT NULL); |
UNIX 时间戳与日期时间转换
当前时间戳
SELECT UNIX_TIMESTAMP(); |
两者都可用于取得当前的 Unix 时间戳,单位为秒。Unix 时间戳表示相对于 UTC 纪元的时间,不应额外手动加“时区偏移秒数”。
时间戳转为可读时间
SELECT FROM_UNIXTIME(1700000000, '%Y-%m-%d %H:%i:%S'); |
%i 表示分钟,%m 表示月份。FROM_UNIXTIME() 按当前会话时区显示时间,可先查看:
SELECT @@session.time_zone, @@system_time_zone; |
如果字段存储毫秒时间戳,需要先除以 1000;字段已经是 DATETIME 时,格式化应考虑 DATE_FORMAT(),不能把它当作整数时间戳。带日期参数的 UNIX_TIMESTAMP() 也涉及会话时区,夏令时切换还可能使转换无法一一对应。支持的范围取决于 MySQL 版本及运行平台。
在筛选范围时,通常优先对原始时间戳列写区间条件,而不是对每行先调用 FROM_UNIXTIME(),以便使用普通列索引。参考 MySQL 日期时间函数。