2016-05-30 61 views
0

我试图更新包含两列的表; idpositionid是唯一的,并自动递增。 position是唯一的,但不会自动增加,实际上必须手动设置。在一个查询中增加每行中的唯一列

我需要更改所有行的位置大于或等于5(或我提供的任何其他数字)以将它们全部递增。这是我的代码:

UPDATE slides 
SET position = position + 1 
WHERE position >= 5; 

不幸的是,它返回以下错误:

Error : Duplicate entry '2' for key 'slides_position_unique'

如何更新所有这些独特的数量,而不会造成冲突,我这样做?我已经尝试了一个查询所有可更新行的子查询,并将其返回,但它无济于事。


CREATE TABLE slides 
    (id int(10) unsigned NOT NULL AUTO_INCREMENT, 
    user_id int(10) unsigned NOT NULL, 
    position int(10) unsigned NOT NULL, 
    PRIMARY KEY (id), 
    UNIQUE KEY slides_position_unique (position), 
    KEY slides_user_id_foreign (user_id), 
    CONSTRAINT slides_user_id_foreign 
    FOREIGN KEY (user_id) REFERENCES users (id)) 
+0

'show create table'slides'的输出是什么? – Asenar

+1

不要将其他信息添加到评论中,而是编辑您的问题并将新信息添加到问题中。这次我为你做了。请记住这一点在未来。谢谢。 –

回答

3

的问题是在唯一约束 - 在更新过程中的值不是唯一的。你能做到这一点的交易或删除约束,然后添加:

ALTER TABLE slides DROP index slides_position_unique; 
UPDATE slides SET position = position + 1 WHERE position >= 1; 
ALTER TABLE slides ADD CONSTRAINT slides_position_unique UNIQUE (position); 

的工作示例见http://sqlfiddle.com#!9/66e0d8

+0

耶稣。这是一个很好的观点,告诉我做奇怪的嵌套的人完全有可能是事实上是错的。 – Forest

+0

返回相同的错误。 – Forest

+0

看看CREATE语句,我看到你在位置上有UNIQUE约束。我认为UPDATE会在位置列中创建重复项。检查这个SQL小提琴:http://sqlfiddle.com#!9/fe46ee/1,你可以看到更新按照预期在简单的输入数据上工作。 – martin

0

错误非常明显:应用此查询会产生重复的行。为了避免改变你的查询。我想这意味着要么删除WHERE position >= 1(更新所有行),要么添加另一个条件来排除slides.position < 1

也许这更简单的查询,为你的作品:

UPDATE slides 
SET position = position + 1 
WHERE position >= 1 AND position IS NOT NULL 

您可能可能使用UPDATE IGNORE slides set position = position+1但是这可以让你失去一些行。

+0

这将返回相同的错误。我也尝试过去除WHERE position> = 1',但无济于事。 – Forest

+0

所以也许你的一些数据是无效的。位置类型='int'和'null'被禁止?我只是编辑了我的答案,以排除无效的位置。否则,如果您确定可能会丢失一些不连贯的数据,您可以尝试'更新忽略'。 – Asenar

+0

空值被禁止,是的。它只是'int'。我很困惑这个问题。 – Forest

1

您可以在更新中使用订单。作为mysql doc事实:

If the ORDER BY clause is specified, the rows are updated in the order that is specified

这将导致:

UPDATE slides 
SET position = position + 1 
WHERE position >= 5 
ORDER BY position DESC; 

这样你更新了较大的第一,那么更大的-1,那么更大的-2等..和独特的索引在分配到下一行之前总是被释放。

相关问题