增加一个数字列,如何不触发唯一约束?

时间:2017-10-30 06:58:51

标签: mysql sql

例如:

CREATE TABLE test_serial_no_entity (
  id BIGINT,
  serial_no BIGINT NOT NULL UNIQUE,
  PRIMARY KEY (id)
);
INSERT INTO test_serial_no_entity (id, serial_no) VALUES (1,1);
INSERT INTO test_serial_no_entity (id, serial_no) VALUES (2,2);
INSERT INTO test_serial_no_entity (id, serial_no) VALUES (3,3);
INSERT INTO test_serial_no_entity (id, serial_no) VALUES (4,4);

serial_no是一个唯一的列,当我执行sql:update test_serial_no_entity set serial_no=serial_no+1 where id>=1时, 我在mysql中得到错误Error Code: 1062. Duplicate entry '2' for key 'serial_no' 0.034 sec,除了取消唯一约束外,还有其他方法可以解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

是,先更新较高的值。

update test_serial_no_entity 
set serial_no=serial_no+1 
where id>=1
ORDER BY serial_no DESC

也可以在manual

中找到此示例

答案 1 :(得分:-1)

尝试循环以一次更新一条记录。从最大数字开始。

CREATE TABLE test_serial_no_entity (
  id BIGINT,
  serial_no BIGINT NOT NULL UNIQUE,
  PRIMARY KEY (id)
);
INSERT INTO test_serial_no_entity (id, serial_no) VALUES (1,1);
INSERT INTO test_serial_no_entity (id, serial_no) VALUES (2,2);
INSERT INTO test_serial_no_entity (id, serial_no) VALUES (3,3);
INSERT INTO test_serial_no_entity (id, serial_no) VALUES (4,4);

Declare @Min int, @Iterator int

Select @Min = min(serial_no) from test_serial_no_entity
Select @Iterator = max(serial_no) from test_serial_no_entity
While(@Iterator >= @Min)
BEGIN
Update test_serial_no_entity
Set serial_no = serial_no + 1
Where serial_no = @Iterator

@Iterator = @Iterator - 1
END

答案 2 :(得分:-2)

尝试在您的ID后面添加AUTO_INCREMENT

id BIGINT NOT NULL AUTO_INCREMENT