3

我有一个自动递增的列 ID,在某些情况下,我希望另一列等于主键 + 1 值

ID | other
1  | 2
2  | 3
3  | 4
4  | 123 (some situation, it is not always plus 1)

我怎样才能做到这一点?

这是我尝试过的

INSERT INTO table (`ID`,`other`) VALUES ('',(SELECT MAX(ID)+1 FROM table))

但这会返回一个错误

You can't specify target table 'table' for update in FROM clause
4

3 回答 3

0

试试下面的查询:

ALTER TABLE dbo.table ADD
Column  AS ([ID]+1)
GO

它肯定会起作用

于 2013-07-26T06:53:37.513 回答
0

使用普通AUTO_INCREMENT列作为 id,我想不出在 MySQL 中执行此操作的方法。触发器,否则将是一个选项,不能很好地与AUTO_INCREMENT列一起使用。

我看到的唯一方法是对INSERT;执行两个命令

INSERT INTO bop (value) VALUES ('These values should be 1 and 2');
UPDATE bop SET other = id+1 WHERE id = LAST_INSERT_ID();

一个用于测试的 SQLfiddle

我最接近您正在寻找的内容是与AUTO_INCREMENT使用函数分开生成序列,并使用它来生成表ID;

DELIMITER //

CREATE TABLE bop (
  id INT UNIQUE,
  other INT,
  value VARCHAR(64)
)//

CREATE TABLE bop_seq ( seq INT ) //    -- Sequence table
INSERT INTO bop_seq VALUES (1)   //    -- Start value

CREATE FUNCTION bop_nextval() RETURNS int
BEGIN
  SET @tmp = (SELECT seq FROM bop_seq FOR UPDATE);
  UPDATE bop_seq SET seq = seq + 1;
  RETURN @tmp;
END//

CREATE TRIGGER bop_auto BEFORE INSERT ON bop
FOR EACH ROW
  SET NEW.id = bop_nextval(), NEW.other=NEW.id + 1;
//

那会让你插入并让它像你想要的那样自动编号。应该保持序列事务的FOR UPDATE安全,但我没有进行负载测试,所以你可能想要这样做。

另一个 SQLfiddle

于 2013-07-26T07:04:24.747 回答
0

我通过更新 2 次数据库解决了这个问题。

我想从 19 到 .. 做 +1

UPDATE `table` SET `id`=`id`+101 WHERE id <= 19 
UPDATE `table` SET `id`=`id`-100 WHERE id <= 119 AND id >= 101
于 2015-11-30T18:10:34.517 回答