MySQL,在其他两个之间插入行

时间:2019-10-31 19:23:52

标签: mysql

我正在为摄影师编码一个网站,目前正在研究图库的实现。 我需要能够从n.a点开始一行并将其移至n.b点 这是原始表的示例:

|gallery_img               |
|--------------------------|
| id | fk_gal | fk_img | o |
|    |        |        |   |
| 0  | 16     | 240    | 1 |
| 1  | 16     | 322    | 2 |
| 2  | 27     | 240    | 1 |
| 3  | 16     | 245    | 3 |
| 4  | 16     | 210    | 4 |
| 5  | 27     | 530    | 2 |

所有字段均为INT(11)。 'id'自动递增。 “ fk_gal”和“ fk_img”通过FOREIGN_KEY链接到其他不相关的表。

现在,“ o”是我关注的领域。它确定图像在网站上显示的顺序。该值对于每个表必须始终是唯一的。要澄清的是,如果我仅调用一个表,则每行中的“ o”应该不同。但是,如果我调用整个表,则“ o [0]”可能会重复出现几次。

这就是我所需要的。首先,我一次只会在一个图库上运行此功能,因此将从此处开始的所有表格视觉效果都将通过“ SELECT * FROM gallery_img WHERE fk_gal = 16”进行过滤。 我需要将'o'从n更改为n2,以将其有效地移动到数据库中。

|gallery_img               |
|--------------------------|
| id | fk_gal | fk_img | o |
|    |        |        |   |
| 0  | 16     | 240    | 1 |
|    |        |        |   |  <--
| 1  | 16     | 322    | 2 |+   |
| 3  | 16     | 245    | 3 |+   |
| 4  | 16     | 210    | 4 |  --|

代码需要将所需的行(在此示例中为'o = 4')移至1,同时将所有接下来的行向下移,以防止再次发生。 这是我现在拥有的代码。我正在通过PHP编写MySql脚本。 我在这里使用$ n变量。它包含以下数据:

$ n = array(gallery_id,img_id,target_o);

            sql("UPDATE gallery_img SET o = o + 1 ORDER BY o ASC LIMIT ". ($n[2] - 1) .", 18446744073709551615;");
            sql("UPDATE gallery_img SET o = ". ($n[2] + 2) ." WHERE fk_img = $n[1] AND fk_gal = $n[0];");

我遇到的问题是,当我执行它时,会得到以下两个输出之一:

|gallery_img               |
|--------------------------|
| id | fk_gal | fk_img | o |
|    |        |        |   |
| 0  | 16     | 240    | 1 |
| 4  | 16     | 210    | 1 | <-- Shouldn't be duplicate
| 1  | 16     | 322    | 2 |
| 3  | 16     | 245    | 3 |


|gallery_img               |
|--------------------------|
| id | fk_gal | fk_img | o |
|    |        |        |   |
| 0  | 16     | 240    | 1 |
| 4  | 16     | 210    | 2 |
| 1  | 16     | 322    | 4 |-|
| 3  | 16     | 245    | 4 | |-- Shouldn't be duplicate
| 5  | 16     | 273    | 4 | |
| 6  | 16     | 14     | 4 |-|

这样思考的好方法:

UPDATE

如果您有任何疑问,请告诉我! 提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

因此,如果您想将WHERE o=4行更改为o=1,则增加要替换的数字和所有更大的数字。

UPDATE gallery_img SET o = (o + 1) WHERE o >= 1

然后更新您要成为的行o=1

UPDATE gallery_img SET o = 1 WHERE fk_img = something1 AND fk_gal = something2

或者,如果您只知道o,请使用o=(4+1),因为它在上次UPDATE中已更改:

UPDATE gallery_img SET o = 1 WHERE o = 5

答案 1 :(得分:2)

我可以建议黑客吗?对于列o,不要使用整数,而应使用DOUBLE PRECISION

仅通过平均上一行和下一行的值,在两行之间插入一行会容易得多。如果您需要在34之间插入,则只需插入带有3.5的行即可。

当然,经过一段时间(至少50次之后),您希望重新编号这些值,因为DOUBLE PRECISION的尾数为53位。