MySQL 如何实现一个只有一行数据的表

文章目录

        MySQL 5.6 实现
        MySQL 5.7 实现
        MySQL 8.0 实现
        总结

我们在之前的文章中介绍了如何在 PostgreSQL 中实现一个只能存储一行数据的表。今天我们来看看如何在 MySQL 中实现相同的功能。

只有一行数据的表通常被用于某些特定的功能,例如存储系统的版本或者配置信息,全局计数器,心跳表等。假如我们有一个表 t_visit,用于记录网页的访问量:

create table t_visit(
  hits bigint not null,
  update_at datetime not null
);



在部署程序时需要生成一条记录,将访问量初始化为 0;以后每次用户访问时需要加 1;为了前端页面能够正确显示,不允许用户删除该记录。这种需求该如何实现?
MySQL 5.6 实现

对于 MySQL 5.6 以及之前的版本,可以通过增加一个 ENUM 枚举字段和唯一约束限制表中只能存储一行数据:

alter table t_visit add only_one_row enum('Y') not null default 'Y';
alter table t_visit add constraint uk_visit unique key (only_one_row);



新增加的字段 only_one_row 非空且取值只能为 Y,同时基于该字段创建了一个唯一约束,因此整个表中只能存储一行数据。

初始化时插入数据如下:

insert into t_visit(hits, update_at) values (0, now());

select * from t_visit;
hits|update_at          |only_one_row|
----|-------------------|------------|
   0|2020-07-07 08:05:03|Y           |


如果数据已经存在,再次插入数据将会返回错误:

insert into t_visit(hits, update_at) values (1, now());
ERROR 1062 (23000): Duplicate entry 'Y' for key 't_visit.uk_visit'



实际上此时应该进行更新操作:

update t_visit
set hits=hits+1,
    update_at= now()
where only_one_row = 'Y';



或者,可以使用INSERT ... ON DUPLICATE KEY UPDATE语句进行统一操作:

更多请见:http://www.mark-to-win.com/tutorial/51582.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值