【问题标题】:Swapping Rows in Database tables By using the primary Key In php/mysql使用 php/mysql 中的主键交换数据库表中的行
【发布时间】:2012-07-02 08:48:27
【问题描述】:

在我的应用程序中,我想交换数据库中的行。

也就是说,我的桌子有以下结构,

Column     Type             Null    Default     Comments

intid         int(11)           No           
intuserid         int(11)           No           
vchimagename      varchar(50)   No  

这里的 intid 是主键。

当我使用此功能进行 wsapping 时,

function row_swap($table, $id1, $id2)
{
    if (!mysql_query("UPDATE $table SET intid='$id1' where intid='$id2'"))
    {
        echo mysql_error() ;
        exit ;
    }
    if (!mysql_query("UPDATE $table SET intid='$id2' where intid='$id1'"))
    {
        echo mysql_error() ;
        exit ;
    }

    return 1;
} 

调用函数,

row_swap('tblupload', 7, 8) ;

然后显示错误,

Duplicate entry '8' for key 'PRIMARY'

那么如何使用主键交换行呢?

如果可以?

【问题讨论】:

  • 不!不要这样做。改变你的主键值不是一个好主意,所以不要养成这个习惯。它将破坏其他相关表与该表的任何关系。
  • @Mark Ba​​ker,那我该如何交换行?
  • 为什么你要“交换”行?
  • 更新这些行的其他字段,不要尝试将您的initid 更改为PRIMARY KEY

标签: php mysql rows swap


【解决方案1】:
function row_swap($table, $id1, $id2)
{
    if (!mysql_query("UPDATE $table SET intid='999999' where intid='$id2'"))
    {
        echo mysql_error() ;
        exit ;
    }
    if (!mysql_query("UPDATE $table SET intid='$id2' where intid='$id1'"))
    {
        echo mysql_error() ;
        exit ;
    }
    if (!mysql_query("UPDATE $table SET intid='$id1' where intid='999999'"))
    {
        echo mysql_error() ;
        exit ;
    }

    return 1;
} 

您应该使用临时 id (999999)

【讨论】:

    【解决方案2】:

    更改主键从来都不是一个好的编码习惯。

    你得到的错误是因为主键

    • 不能有重复记录(意味着它应该是唯一的)
    • 不能留空

    假设您的变量设置为 id1 = 1 id2 = 2

    现在您在第一个查询中所做的是将 id2 与 id1 交换

    mysql_query("UPDATE $table SET intid='$id1' where intid='$id2'")
    

    现在数据库中的字段更新为 id1 = 2 id2 = 2

    这违反了主键的规则。所以你有一个错误

    键“PRIMARY”的重复条目“8”

    解决方案是取一个虚拟值作为 temp,然后交换这些值。如果您解决了交换两个数字的问题(在学校或学习任何编程语言时),您可能已经这样做了。

    你取一个临时变量并将数字 A 和 B 交换为

    temp = A;
    A = B;
    B = Temp;
    

    @NobitaZZ 提供的解决方案是正确的,除非并且直到您的 intid 值达到 999999 的标记。选择一个您知道不会干扰您的逻辑的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 2017-11-06
      • 2014-05-25
      相关资源
      最近更新 更多