MySQL 建表审计字段规范用法

我们在使用数据库的过程中几乎所有表都会有几个字段是必须存在的。它们与业务无关,但是可以帮助我们追溯记录简单的插入和更新过程,是"辅助"一般的存在。

字段备注
id主键,在单数据库下由数据库自增实现,用来追踪记录
creator记录创建者,用于跟踪记录创建人
updator记录更新更新人,用于追踪记录更新人
create_time创建时间,用于追踪记录创建时间
update_time更新时间,用于追踪记录更新时间
del逻辑删除字段,用于标记记录是否已经被删除

这里我们介绍一下辅助中的特殊字段–时间相关的字段。

create_time 创建时间

这个字段一般用于追踪记录的创建时间,在插入记录时会将当前时间记录在该字段上,我们可以在建表是给它定义一个默认值。

create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

update_time 更新时间

这个字段一般用于追踪记录的更新时间,与创建时间一样它一般与业务逻辑无关,当记录发生更新操作时需要同时更新该字段,我们同样不希望这个字段的更新操作交给我们业务代码。那么就在建表是设置让它自己更新吧。

-- 表明该字段非空,默认值为当前时间戳,并且在更新操作时同时更新该字段为当前时间戳
update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

示例

-- 这里新建一张用户表,只有一个 name 的业务字段,其余都是审计字段
CREATE TABLE user(
	id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
	name varchar(255),
	create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
	update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
	creator varchar(255) NOT NULL,
	updator varchar(255) NOT NULL,
	del varchar(255) NOT NULL DEFAULT 'n'
)ENGINE="InnoDB",charset="utf8mb4";
关于 del 字段的思考

之前遇到过一个场景,是有关 del 逻辑删除 和唯一索引冲突的问题,我有记录是通过逻辑删除删掉了,但是这条记录实际上还是存在的。当我想要重新插入这条数据的时候由于原来被删除的数据还在导致新的数据被唯一索引限制住了插不进去。当然我们这里可以使用 REPLACE INTO 的方式将原来的数据删除后插入 或者INSERT FOR UPDATE 插入时条件更新

但是如果我既想要留住原来已经被逻辑删除的数据,又想插入新的记录使两者不发生冲突怎么办?

解决方式是唯一索引中加入del审计字段,使得唯一的判定范围扩大。

比如上面那张表,我希望在 name字段 上创建唯一索引。并插入记录。

-- 在 user 表的 name 字段上创建索引
CREATE UNIQUE INDEX uk_name ON user(name);
-- 插入一条记录
INSERT INTO user(name,creator,updator) values("张三","ghimi","ghimi");
-- 逻辑删除该记录
UPDATE user set del='y' WHERE id=1;
-- 重新插入该记录时会报错
INSERT INTO user(name,creator,updator) values("张三","ghimi","ghimi");
-- 为了保证唯一索引和逻辑删除字段不冲突,我们需要在该表的所有唯一索引中加入 del 审计字段
DROP INDEX IF EXISTS uk_name on user;
CREATE UNIQUE INDEX uk_name_del ON user(name,del);
-- 同时逻辑删除修改为
UPDATE user set del=concat('y-',now()) WHERE id=1;
-- 这样再次插入相同的记录的时候就不会报唯一索引错误了

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值