自动递增UPDATE查询ID或序列号

时间:2014-06-16 13:24:41

标签: php mysql

在MySQL中使用INSERT语句,可以很容易地为主键输入AUTO_INCREMENT值。 UPDATE声明是否有这样的功能?

我想象的是一张像这样的桌子:

users
userid  username    password    email   ... unique_updated_id

每次用户更新users表格中的内容时,unique_updated_id都会包含MAX(unique_updated_id)+1。这将用于与数据库同步的系统中。它会记住收到的最后一个unique_updated_id,并在从服务器获取更新时将其发回。

因此,当用户更改数据库中的信息时,他们的unique_updated_id将更新为SELECT MAX(unique_updated_id)+1 FROM users。这将告诉同步过程,只有在指定unique_updated_id之后更新的信息才会被发送。

但是,我担心由于可能的竞争条件,我可能无法实现理想的行为

UPDATE users SET email='something@something.net',unique_updated_id=(SELECT MAX(unique_updated_id)+1 FROM users) WHERE userid=1;

如何确保unique_updated_id始终是唯一的,并且会为所有UPDATEINSERT个查询提供连续编号?

我正在尝试在PHP中实现这一点,因此执行以分号分隔的查询似乎不是确保连续执行两个查询而不在其间执行其他查询的解决方案。

2 个答案:

答案 0 :(得分:1)

这就是我使用MySQL Triggers

的方式
CREATE TABLE IF NOT EXISTS `test` (
  `testid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `test` text NOT NULL,
  `tuple` int(10) unsigned NOT NULL,
  PRIMARY KEY (`testid`),
  UNIQUE KEY `tuple` (`tuple`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

INSERT INTO `test` (`testid`, `test`, `tuple`) VALUES
(2, 'whateversadfa jdsfj', 5),
(3, 'whaatasdfljsdflkj', 4);

DROP TRIGGER IF EXISTS `PLUSONEA`;
DELIMITER //
CREATE TRIGGER `PLUSONEA` BEFORE INSERT ON `test`
 FOR EACH ROW SET NEW.tuple=(SELECT MAX(tuple)+1 FROM test)
//
DELIMITER ;

DROP TRIGGER IF EXISTS `PLUSONEB`;
DELIMITER //
CREATE TRIGGER `PLUSONEB` BEFORE UPDATE ON `test`
 FOR EACH ROW SET NEW.tuple=(SELECT MAX(tuple)+1 FROM test)
//
DELIMITER ;

要测试,请执行以下操作:

UPDATE test SET test='hello' WHERE testid=2; # this would update tuple of testid=2 to 6
INSERT INTO test (test) VALUES ('hi'); # this would update tuple of testid=4 to 7
UPDATE test SET test='world' WHERE testid=3; # this would update tuple of testid=3 to 8
UPDATE test SET test='abc' WHERE testid=4; # this would update tuple of testid=4 to 9

答案 1 :(得分:0)

我不知道这些方法是否存在,但您可以通过创建另一个表来存储更新的元组来解决您的问题。当同步过程运行时,让它删除同步行。