我有一个MySQL数据库,每次执行insert或update时,我都需要自动增加1列。如果必须只在插入期间增加列,则可以使用内置自动增量选项(通常用于主键)。如何进行插入和更新?
编辑
对不起,我贴错了问题,实际上我需要的是每次插入或更新时增加一个计数器1,计数器的当前值必须存储在正在创建或更新的行中。计数器从1开始,再也不回来了,它只是不断增加“永远”(BIGINT)。把这个计数器看作是一个lastupdate时间戳,但我使用的不是真实的Unix时间戳,而是一个不断增加的整数(单调递增的值)。
我正在实现多个本地SQLite数据库和一个主MySQL数据库之间的同步机制,因此这种行为必须在这两个数据库管理系统上实现。
当然,计数器的当前状态可以存储在单独的表中。
发布于 2017-09-12 07:16:58
只需使用触发器。
就像这样:
CREATE TRIGGER trgIU_triggertestTable_UpdateColumnCountWhenColumnB
ON dbo.triggertestTable
AFTER INSERT,UPDATE
AS
BEGIN ...或者你可以这样做:
INSERT INTO TableA (firstName, lastName, logins) VALUES ('SomeName', 'SomeLastName', 1)
ON DUPLICATE KEY UPDATE count = count + 1;发布于 2017-09-12 07:17:35
我看到了两种方法来做你想做的事。
第一个是插入,当您应该使用自动增量键时。但是,当我们谈到自动增量更新时,它会稍微复杂一些。对我来说,最好的解决办法就是触发。
你可以用这样的触发器:
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发布于 2017-09-12 07:18:33
没有声明式自动增量的更新功能.自动增量必须是主键的一部分,所以这可能不是您的计数器。
你可以用触发器做这件事。
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语句中插入多个行:
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。
https://stackoverflow.com/questions/46170129
复制相似问题