php pdo切换主键值

时间:2017-03-25 11:14:33

标签: php mysql pdo

如果有人问过我很抱歉,但我找不到任何可以帮助我的事情。我试图在我的表中切换两个主键的值,因为1变为2,2变为1。 我收到此错误 SQLSTATE [23000]:完整性约束违规:1062重复条目' 2'对于关键' PRIMARY

我对mysql不太熟悉。你会如何解决这个问题

<?php
//Connect to the DB
require_once('connect.php');
//insert names into the DB
$MoveToTwo = '2';
$MoveToOne = '1';

try{
    global $db;
    $inserts = $db->prepare("UPDATE slider_images SET id=:MoveToOne WHERE id=:MoveToTwo");
    $inserts = $db->prepare("UPDATE slider_images SET id=:MoveToTwo WHERE id=:MoveToOne");
    $inserts->bindParam(':MoveToOne', $MoveToOne);
    $inserts->bindParam(':MoveToTwo', $MoveToTwo);
    $inserts->execute();
}

catch(Exception $e){
    echo $e->getMessage();
    exit;
}
?>

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你可以按行排序。

在mysql中操作一个id是一个坏主意,因为它是你行的mysql标识符并自动生成。

更好的解决方案是添加一个名为ordered的新列(不要使用order,因为保留了Mysql密钥)。然后,您可以更轻松地更新此值而不会发生冲突,并在您的选择查询中添加ORDER BY ordered ASC以获得与之前相同的效果。

要完成保存,您需要在行创建时添加值。为此,在保存参赛作品之前,你会指望你的行号。

答案 1 :(得分:0)

表格的id列设置为主键,必须唯一,因此无法更新为现有值。唯一的选择是删除行并使用新值重新插入。

但是您的代码存在问题,您准备两次,第二次覆盖您的第一次准备。其次,准备好的陈述的重点是你可以重新绑定值。

$dstmt = $db->prepare("DELETE FROM slider_images WHERE id = ?");
$sstmt = $db->prepare("SELECT cola, colb, colc, etc FROM slider_images  WHERE id = ?");
$istmt = $db->prepare("INSERT INTO slider_images (id, colb, colc, etc) VALUES (?,?,?,?)");

$result_a = $sstmt->execute([$MoveToOne]);
$result_b = $sstmt->execute([$MoveToTwo]);

$row_a = $result_a->fetch();
$row_b = $result_b->fetch();

$dstmt->execute([$MoveToTwo]);
$dstmt->execute([$MoveToOne]);

$istmt->execute([$MoveToOne, $row_b['colb'], $row_b['colc'], $row_b['etc']]);
$istmt->execute([$MoveToTwo, $row_a['colb'], $row_a['colc'], $row_a['etc']]);

它像这样短得多,基本上也一样,但如果你确定id不存在,你可以使用update语句。