添加新记录时自动将旧记录的last字段设为0的实现方案
实现新增记录时自动将旧记录last字段设为0的方案
方案一:手动事务包裹(适合可控场景)
通过事务保证更新和插入操作的原子性,避免出现部分执行的异常情况。以MySQL为例:
START TRANSACTION; -- 先将所有已有记录的last设为0 UPDATE your_table SET last = 0; -- 插入新记录(若表结构已给last设默认值1,此处可省略last字段) INSERT INTO your_table (column1, column2) VALUES ('val1', 'val2'); COMMIT;
注意:如果表数据量极大,全表UPDATE会占用大量资源并锁表,要评估性能影响后再使用。
方案二:数据库触发器(自动处理)
创建触发器让系统在每次插入新记录时自动触发更新操作,无需手动编写事务逻辑。
MySQL 示例:
DELIMITER // CREATE TRIGGER reset_old_last BEFORE INSERT ON your_table FOR EACH ROW BEGIN UPDATE your_table SET last = 0; END // DELIMITER ;
PostgreSQL 示例:
先创建触发器函数,再绑定触发器:
CREATE OR REPLACE FUNCTION reset_old_last_func() RETURNS TRIGGER AS $$ BEGIN UPDATE your_table SET last = 0; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER reset_old_last_trigger BEFORE INSERT ON your_table FOR EACH STATEMENT EXECUTE FUNCTION reset_old_last_func();
注意:触发器会在每次INSERT时自动执行,同样要注意大数据量下的全表更新性能问题。如果数据量较大,建议改用时间戳标记最新记录的方式(比如新增
created_at字段,查询时取created_at最大的记录作为最新),避免全表更新的开销。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

