首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >插入和更新时的MySQL自动增量

问插入和更新时的MySQL自动增量
EN

Stack Overflow用户
提问于 2017-09-12 07:11:24
回答 3查看 3.4K关注 0票数 1

我有一个MySQL数据库,每次执行insert或update时,我都需要自动增加1列。如果必须只在插入期间增加列,则可以使用内置自动增量选项(通常用于主键)。如何进行插入和更新?

编辑

对不起,我贴错了问题,实际上我需要的是每次插入或更新时增加一个计数器1,计数器的当前值必须存储在正在创建或更新的行中。计数器从1开始,再也不回来了,它只是不断增加“永远”(BIGINT)。把这个计数器看作是一个lastupdate时间戳,但我使用的不是真实的Unix时间戳,而是一个不断增加的整数(单调递增的值)。

我正在实现多个本地SQLite数据库和一个主MySQL数据库之间的同步机制,因此这种行为必须在这两个数据库管理系统上实现。

当然,计数器的当前状态可以存储在单独的表中。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-12 07:16:58

只需使用触发器。

就像这样:

代码语言:javascript
复制
CREATE TRIGGER trgIU_triggertestTable_UpdateColumnCountWhenColumnB
   ON  dbo.triggertestTable
   AFTER INSERT,UPDATE
AS 
BEGIN ...

或者你可以这样做:

代码语言:javascript
复制
INSERT INTO TableA (firstName, lastName, logins) VALUES ('SomeName', 'SomeLastName', 1)
ON DUPLICATE KEY UPDATE count = count + 1;
票数 3
EN

Stack Overflow用户

发布于 2017-09-12 07:17:35

我看到了两种方法来做你想做的事。

第一个是插入,当您应该使用自动增量键时。但是,当我们谈到自动增量更新时,它会稍微复杂一些。对我来说,最好的解决办法就是触发。

你可以用这样的触发器:

代码语言:javascript
复制
CREATE TRIGGER update_trigger
AFTER UPDATE
ON `your_table`
FOR EACH ROW
    BEGIN
        UPDATE `your_table`
        SET `the_field_you_want_autoincrement` = `the_field_you_want_autoincrement` + 1
        WHERE `pk` = NEW.pk
    END
票数 1
EN

Stack Overflow用户

发布于 2017-09-12 07:18:33

没有声明式自动增量的更新功能.自动增量必须是主键的一部分,所以这可能不是您的计数器。

你可以用触发器做这件事。

代码语言:javascript
复制
CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable
FOR EACH ROW
  SET NEW.counter = 1;

CREATE TRIGGER MyTrigger BEFORE UPDATE ON MyTable
FOR EACH ROW
  SET NEW.counter = OLD.counter+1;

这些必须在触发器之前,因为不能在后置触发器中设置列值。

关于你的评论:

我不明白“第二条语句中的每一行”

这是所有MySQL触发器的必选子句,因为该触发器针对插入的每一行运行。可以在一个insert语句中插入多个行:

代码语言:javascript
复制
INSERT INTO MyTable VALUES (...), (...), (...), ...

INSERT INTO MyTable SELECT ... FROM ...    

插入触发器将初始化插入的每一行。

关于您最新的问题:

上面显示的带有触发器的解决方案实际上适用于您描述的场景,您希望在插入时从1开始使用计数器列,每次更新时都要增加1。

使用INSERT...ON DUPLICATE KEY UPDATE的解决方案不起作用,因为如果用户只执行UPDATE语句,它不会增加计数器。此外,还要求用户在其INSERT语句中包含初始计数器值1。

insert触发器将初始值设置为1,即使用户试图在其INSERT语句中提供不同的值。即使用户使用INSERT...ON DUPLICATE KEY UPDATE或UPDATE,更新触发器也会增加计数器。

但是不要使用REPLACE语句,因为这将执行一个DELETE和一个新的INSERT,因此它将运行insert触发器,并将计数器重置为1。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46170129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档