在我当前的应用程序中,我正在制作一个菜单结构,它可以递归地创建自己的子菜单。然而,由于这个原因,我发现很难也允许某种重新排序方法。大多数应用程序可能只是通过“排序”列进行排序,但是在这种情况下,尽管这样做似乎并非不可能,只是有点困难。
我想做的是使用 ID 列。因此,如果我将 id 10 更新为 id 1,那么之前的 id 1 将变为 2。
我在 friend 的建议下想到的是使用级联。然而,做更多的研究似乎并没有像我想象的那样起作用。
所以我的问题是,是否有能力在 MySQL 中简单地执行此操作?如果是这样,我可以用什么方式做到这一点?如果不是,您建议如何得出最终结果?
列:
id title alias icon parent
parent 的 id 比他们的 child 低,以确保脚本创建数组以将 child 放入其中。该部分有效,但是如果我想使用排序列,我将不得不制作一个编号系统,以确保子元素在结果中永远不会高于其父元素。可能,但如果我更新一个父项,那么我也必须唯一地更新它的所有子项,从而导致我想要的更多 MySQL 查询。
我不是 MySQL 专家,所以这就是我提出这个问题的原因,我觉得可能有一个完美的解决方案可以在应用程序速度方面允许最少的开销。
1 Câu trả lời
在 ID 列上执行此操作会很困难,因为您永远不可能有 2 行具有相同的 ID,因此您不能将第 10 行设置为第 1 行,直到您将第 1 行设置为第 2 行之后,但您可以在将第 2 行设置为第 3 行之前,不要将第 1 行设置为第 2 行,等等。您必须删除第 10 行,然后执行更新 ID += 1 WHERE ID < 10 ... 但您还必须告诉 MySQL 从最高的数字开始往下走....
您必须像这样在单独的查询中执行此操作:
将 ID 10 移至 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, ...);
另一种选择,如果您不想删除和重新插入,则将第 10 行的 id 设置为 MAX(id) + 1,然后在之后将其设置为 1
此外,如果您想将第 2 行移动到第 10 行,则必须减去 id:
将 ID 2 移至 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, ...);
如果您没有将 ID 列设置为 UNSIGNED
,您可以将所有要切换到负数的 ID 设置为负数,因为 AUTO_INCREMENT 不会计算负数。这仍然很老套,我不推荐它。您可能还需要锁定表,以便在运行时不会发生其他写入。:
将 ID 2 移至 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;
关于php - 更新、插入和删除时的 MySQL 更新 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17386964/
Tôi đang chạy PHP trong một tệp JavaScript, như... var = '';). Tôi cần sử dụng JavaScript để quét chuỗi để tìm các ký tự phân cách PHP (mở và đóng PHP). Tôi đã biết cách rồi
Tôi muốn có thể làm điều gì đó như thế này: php --determine-oldest-supported-php-version test.php và nhận được kết quả đầu ra này: 7.2 Nghĩa là nhị phân php được kiểm tra theo thử nghiệm.
Tôi đang phát triển một trang web php lớn hiện không sử dụng bất kỳ framework nào. Câu hỏi lớn của tôi là, liệu có nên thử tích hợp dần dần khung vào ứng dụng theo thời gian, chẳng hạn như tạo các tiện ích mới và cập nhật các tiện ích cũ không? Ví dụ, tất cả các trang đều được phục vụ trực tiếp thông qua URL.
Dưới đây là mã nguồn của tôi, tôi muốn sử dụng biến $r1 nằm trong tập lệnh php ở cuối trong một tập lệnh php khác ở đầu cùng một trang. Tôi cần một giải pháp đơn giản cho vấn đề này. Tôi muốn sử dụng biến đó trong truy vấn cập nhật có trong mã. $tên)
Tôi đang tạo một trang web thực hiện nhiều chuyển hướng PHP tùy thuộc vào các tình huống khác nhau. Giống như thế này... header("Location: somesite.com/redirectedpage.php"); để bảo mật