0

私のアプリケーションでは、データベース内の行を交換したいと考えています。

つまり、私のテーブルには次の構造があります。

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'

では、主キーを使用して行を交換するにはどうすればよいですか?

もし可能ならば?

4

2 に答える 2

0

主キーを変更することは、決して良いコーディング方法ではありません。

あなたが得ているエラーは、主キーが

  • 重複レコードを持つことはできません (一意であることを意味します)
  • NULL のままにすることはできません

変数が id1 = 1 id2 = 2 として設定されているとします。

最初のクエリで行ったことは、id2 を id1 に交換したことです。

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

データベースでは、フィールドは id1 = 2 id2 = 2 として更新されます

これは、主キーの規則に違反しています。だからあなたはエラーが発生しました

キー「PRIMARY」のエントリ「8」が重複しています

解決策は、ダミーの値を temp として取得し、値を交換することです。2 つの数字を交換する問題を (学校で、またはプログラミング言語を学習しているときに) 行った場合は、これを行った可能性があります。

あなたは一時変数を取り、番号AとBを次のように交換します

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

intid 値が 999999 に達しない限り、@NobitaZZ が提供する解決策は正しいものです。ロジックに干渉しないことがわかっている値を選択してください。

于 2012-07-02T10:17:40.533 に答える
0
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) を使用する必要があります。

于 2012-07-02T08:51:42.743 に答える