MySQL插入和更新时自动递增

时间:2017-09-12 07:11:25

标签: mysql sql

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

修改

抱歉,我发布了错误的问题,我实际需要的是每次插入或更新时将计数器增加1,计数器的当前值必须存储在正在创建或更新的行中。计数器从1开始,永远不会回来,它只是不断增加"永远" (BIGINT)。将此计数器视为const propTypes = { value: React.PropTypes.object, type: React.PropTypes.string, callBack: React.PropTypes.func, ONE: React.PropTypes.bool, TWO: React.PropTypes.bool, }; const defaultProps = { callBack: () => {}, onChange: () => { }, value: { type: '' }, ONE: true, TWO: true, }; class ProviderInfosComponent extends Component { constructor(props) { super(props); const initialValue = props.value; this.state = { ...initialValue, ONE: this.props.ONE, TWO: this.props.TWO, }; this.onONEClick = this.onONEClick.bind(this); this.onTWOClick = this.onTWOClick.bind(this); } 时间戳,但不使用实际的unix时间戳,而是使用不断增加的整数(单调递增值)。

P.S。我在许多本地SQLite数据库和一个主MySQL数据库之间实现了同步机制,因此必须在两个dbms上实现该行为。

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

3 个答案:

答案 0 :(得分:3)

只需使用triggers

这样的事情:

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;

答案 1 :(得分:1)

我看到两种方法可以做你想做的事。

第一个是插入,当您应该使用自动增量键时。但是,当我们谈论自动增量更新时,它会有点复杂。对我来说,最好的解决方案就是触发。

你可以使用这样的触发器:

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

答案 2 :(得分:1)

没有声明性的自动增量更新功能。并且自动增量必须是主键的一部分,因此这可能不是您的计数器。

您可以使用触发器执行此操作。

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;

这些必须是BEFORE触发器,因为您无法在AFTER触发器中设置列值。

重新评论:

  

我没有得到“对于第二个陈述中的每一行”

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

INSERT INTO MyTable VALUES (...), (...), (...), ...

INSERT INTO MyTable SELECT ... FROM ...    

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

重新提出您的最新问题:

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

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

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

但是不要使用REPLACE语句,因为这会执行DELETE后跟新的INSERT,因此会运行插入触发器,并将计数器重置为1。