MySql的TIMESTAMP自动更新和初始化

MySql的TIMESTAMP\DATETIME自动更新和初始化

概述

很多时候,在设计表的过程中,考虑将行数据的创建时间和最后更新时间记录,希望数据库服务器自己管理,而不是在应用程序中控制创建时间和最后更新时间字段。在MySQL中,就可以借助DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP 轻松实现,不过也需要一些注意的坑。

简单示例

-- 创建测试表
CREATE TABLE `timestamp_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

-- 插入测试数据
INSERT INTO timestamp_test (name) VALUES ('t1'),('t2'),('t3');

-- 更新测试数据
UPDATE timestamp_test SET name = 't01' WHERE id = 1;

插入测试数据

更新测试数据

注意

  1. 更新操作过程中,只有改变当前值,UPDATE CURRENT_TIMESTAMP才会被触发,也就是如果更新值是当前值,自动更新列不会更新时间,如下图:
    更新测试数据

  2. Timestamp类型的默认值

    MySQL5.6.6加入系统变量explicit_defaults_for_timestamp控制Timestamp类型默认值控制,MySQL5.6.6默认explicit_defaults_for_timestamp变量被禁用,即默认Timestamp类型字段会有如下行为:

    • 如果TIMESTAMP列没有显式声明NULL属性,那么该列会被自动加上NOT NULL属性,如果往这个列中插入NULL值,会自动的设置该列的值为current timestamp值。(而其他类型的列如果没有被显式声明NOT NULL,那么是允许插入NULL值的)

    • 表中的第一个TIMESTAMP列,如果没有显式声明NULL属性或者没有指定默认值,也没有显式声明ON UPDATE。那么该列会自动被加上DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP属性。

    • 第一个TIMESTAMP列之后的其他TIMESTAMP类型列,如果没有显式声明NULL属性,也没有指定默认值,那么该列会被自动加上`DEFAULT ‘0000-00-00 00:00:00’属性。如果insert语句中没有为该列指定值,那么该列中插入’0000-00-00 00:00:00’,并且没有warning。

      但以上这些行为还受限于sql_mode,如果NO_ZERO_DATE启用了,也就是严格模式。由于TIMESTAMP列默认NOT NULL,那么第一个TIMESTAMP列之后的其他TIMESTAMP类型列,默认必须显式声明NULL或者设置默认值,而且默认值不能为NULL0时间戳。

      不过explicit_defaults_for_timestamp变量如昙花一现,MySQL5.6.6版出现,也在MySQL5.6.6弃用,在MySQL8.0.2下explicit_defaults_for_timestamp默认开启。

参考
  1. Automatic Initialization and Updating for TIMESTAMP and DATETIME
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个简单的购物车接口示例,使用Express框架和MySQL数据库。 1. 初始化项目 首先,创建一个名为“shopping-cart”的项目文件夹,并在其中初始化一个Node.js项目: ``` mkdir shopping-cart cd shopping-cart npm init ``` 按照提示输入项目信息和依赖项,然后安装Express和MySQL: ``` npm install express mysql --save ``` 2. 创建数据库和表格 在MySQL中创建一个名为“shopping_cart”的数据库,并创建两个表格:一个用于存储购物车信息,另一个用于存储商品信息。 ``` CREATE DATABASE shopping_cart; USE shopping_cart; CREATE TABLE cart ( id INT(11) PRIMARY KEY AUTO_INCREMENT, product_id INT(11) NOT NULL, quantity INT(11) NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE products ( id INT(11) PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, price DECIMAL(10,2) NOT NULL, image_url VARCHAR(500), description VARCHAR(2000) ); ``` 3. 配置Express应用程序 在项目文件夹中创建一个名为“app.js”的文件,并编写以下内容: ```javascript const express = require('express'); const mysql = require('mysql'); const app = express(); const port = 3000; const dbConfig = { host: 'localhost', user: 'root', password: 'password', database: 'shopping_cart', }; const connection = mysql.createConnection(dbConfig); app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.get('/', (req, res) => { res.send('Hello, shopping cart!'); }); app.get('/products', (req, res) => { connection.query('SELECT * FROM products', (error, results) => { if (error) throw error; res.json(results); }); }); app.listen(port, () => { console.log(`Server listening on port ${port}.`); }); ``` 这是一个最简单的Express应用程序,监听3000端口,并向根路径发送问候消息。此外,它还包含一个路由,用于从数据库中检索商品信息,并将其作为JSON响应发送。 4. 编写购物车接口 为了将商品添加到购物车,我们需要编写以下两个用于处理POST请求的路由。 ```javascript app.post('/cart/:product_id', (req, res) => { const productId = req.params.product_id; const quantity = req.body.quantity; connection.query( 'INSERT INTO cart (product_id, quantity) VALUES (?, ?)', [productId, quantity], (error, result) => { if (error) throw error; res.json(result); } ); }); app.delete('/cart/:id', (req, res) => { const cartItemId = req.params.id; connection.query( 'DELETE FROM cart WHERE id = ?', [cartItemId], (error, result) => { if (error) throw error; res.json(result); } ); }); ``` 在“/cart/:product_id”路由中,我们接收请求参数(商品ID和数量),并将其插入到cart表中。在“/cart/:id”路由中,我们接收购物车项的ID,并将其从表中删除。 5. 测试接口 我们可以使用Postman等工具来测试API。使用POST请求向“http://localhost:3000/cart/1”发送以下JSON有效载荷: ``` { "quantity": 3 } ``` 这应该会将商品ID为1的商品添加到购物车中。接下来,使用DELETE请求向“http://localhost:3000/cart/1”发送,以删除购物车中的第一个项目。 6. 总结 在本教程中,我们演示了如何使用Express和MySQL创建一个简单的购物车接口。当然,这只是一个开始,您可以将其扩展为更完整的购物车应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值