0

値を削除するときに整然としたキューを維持するために選択する必要がある設定。自動インクリメントと主キーを持つ id でテーブルを作成します。初めて値を挿入するときは問題ありません。いくつか1,2,3,4,5...の値を削除すると、順序が次のように変わります1,5,3...。そして、スクリプトはうまく機能しません。

いくつかのコード:

if(isset($submit)){

    if($pav2 == ""){
        header('Location: index.php');  
    }

    else {

    $select = mysql_query("SELECT new_id from naujiena ORDER by new_id");
    $zym = mysql_num_rows($select);

    if($zym == 0) {
    $query = mysql_query("INSERT INTO naujiena (new_id,new_pav) VALUES ('1','$pav2')");
    header('Location: index.php');
    }

    else {
         $select2 = mysql_query("SELECT new_id from naujiena ORDER BY new_id DESC LIMIT 1");
         $max_public_id = mysql_fetch_row($select2);
         $query2 = mysql_query("INSERT INTO naujiena (new_id,new_pav) VALUES ('$max_public_id[0]'+1,'$pav2')");

         header('Location: index.php');
    }

    }
}

new_pav と new_id が追加されたばかりの場合: 例:

new_id new_pav
5      some_value
4      some_value
3      some_value
2      some_value
1      some_value

何かを削除すると、次のようになります。たとえば、次のようになります。

new_id new_pav
4      some_value
2      some_value
3      some_value
1      some_value
4

1 に答える 1

1

ここで気になっているのは、データベース内のテーブルとは何かについてのよくある誤解です。

空白のテーブルから始めて、いくつかの行を追加すると、主キーによって昇順の一意の値のシーケンスが得られます。簡単SELECT * FROM MyTableに実行すると、次のようになります。

MyTable
ID  other columns
1   row1
2   row2
3   row3
4   row4
5   row5

素敵できれいですね。次に、そのテーブルから行 (行 2 と行 4 など) を削除すると、同じ選択で次の結果が得られると予想されます。

MyTable
ID  other columns
1   row1
3   row3
5   row5

残念ながら、それはどのように機能するかではなく、代わりにこれを取得する可能性があります:

MyTable
ID  other columns
1   row1
5   row5
3   row3

それほどきれいではありません。理由は簡単です。クエリを実行すると、SELECT * FROM MyTableクエリによって返される行の順序がundefinedです。特定の順序を指定しない限り、データベースは任意の順序でtham を与えることができます。

実際に行を特定の一貫した順序にしたい場合は、 so と言う必要があります。

SELECT * FROM MyTable ORDER BY idあなたが探しているものを提供します。

そもそもなぜそれが機能したのですか?削除する前に行が完全な順序であったのはなぜですか? これはたまたま、データベースが新しいテーブルからそのデータを取得できる最も効率的な順序であり、それ以上でもそれ以下でもありません。データベースにこれを行うためのより効率的な方法があれば、そもそも別の順序で開始していたでしょう。

編集:あなたの編集以来、あなたの問題は私が最初に考えていたものとは異なります。最高のIDを持つ行を削除すると、新しい行が同じIDを取得することを懸念しているようです。これは、全体を必要以上に複雑にしたためです。

ステップ 1: データベースを変更する

このSQL Fiddlenew_idに示すように列を設定しますINT AUTO_INCREMENT PRIMARY KEY

ステップ 2: コードを次のように変更します (元のコードの SQL インジェクションの問題も修正します)。

if(isset($submit)){

    if($pav2 == ""){
        header('Location: index.php');  
    }
    else {
         $query2 = mysql_query("INSERT INTO naujiena (new_id,new_pav) VALUES (0,'". mysql_real_escape_string($pav2)."')");

         header('Location: index.php');
    }

    }
}
于 2013-03-10T12:13:58.457 に答える