2

私の現在のアプリケーションでは、それ自体でサブメニューを再帰的に作成できるメニュー構造を作成しています。ただし、このため、ある種の並べ替え方法も許可するのが難しいと感じています。ほとんどのアプリケーションは「順序付け」列で順序付けするだけですが、この場合は不可能ではないように見えますが、少し難しくなります。

私がやりたいのは、ID列を使用することです。したがって、id 10 を id 1 に更新すると、以前は存在していた id 1 が 2 になります。

友人からの提案で考えていたのは、カスケードを使用することでした。しかし、私が考えていたようにうまくいかないように見えるもう少しの調査を行っています。

私の質問は、MySQL で単純にこれを行う機能はありますか? もしそうなら、私はそれをどのように行うことができますか?そうでない場合、最終結果に到達するために何を提案しますか?

列:

id title alias icon parent

親は子よりも低い ID を持ち、スクリプトが子を内部に配置する配列を作成するようにします。その部分は機能しますが、順序付け列を使用する場合は、結果で子要素がその親よりも高くならないようにする番号付けシステムを作成する必要があります。可能ですが、親を更新する場合は、そのすべての子も一意に更新する必要があるため、より多くの MySQL クエリが必要になります。

私は MySQL の専門家ではないため、この質問を持ち出しました。アプリケーションの速度に関しては、オーバーヘッドを最小限に抑えることができる完璧な解決策があると思います。

4

1 に答える 1

1

Doing it on the ID column would be tough because you can't ever have 2 rows with the same ID so you can't set row 10 to row 1 until after you've set row 1 to row 2 but you can't set row 1 to row 2 until you set row 2 to row 3, etc. You'd have to delete row 10 and then do an update ID += 1 WHERE ID < 10... but you'd also have to tell MySQL to start from the highest number and go down....

You'd have to do it in separate queries like this:

Move ID 10 to ID 2

DELETE FROM table WHERE id = 10;

UPDATE table SET id = id + 1 WHERE id >= 2 AND id < 10 ORDER BY id DESC

INSERT INTO table (id, ...) VALUES (2, ...);

Another option, if you don't want to delete and reinsert would be to set the id for row 10 to be MAX(id) + 1 and then set it to 1 after

Also if you want to move row 2 to row 10 you'd have to subtract the id:

Move ID 2 to ID 10

DELETE FROM table WHERE id = 2;

UPDATE table SET id = id - 1 WHERE id > 2 AND id <= 10 ORDER BY id DESC

INSERT INTO table (id, ...) VALUES (10, ...);

If you don't have your ID column set as UNSIGNED you could make all the IDs you want to switch to negative ids since AUTO_INCREMENT doesn't do negative numbers. Still this is pretty hacky and I wouldn't recommend it. You also probably need to lock the table so no other writes happen while this is running.:

Move ID 2 to ID 10

UPDATE table SET id = id * -1 WHERE id > 2 AND id <= 10;

UPDATE table SET id = 10 WHERE id = 2;

UPDATE table SET id = id * -1 - 1 WHERE id < -2 AND id >= -10;
于 2013-06-30T04:04:30.610 に答える