各位大家好!我认为这不应该是一个非常难的 - 但我对MySQL缺乏经验,并且一直有一个棘手的时间来确定正确的方法来做到这一点。我不想最终做些傻事。
所以,我有一个杂货项目列表我的顺序我想转移。
我希望它看起来像这样:
id label position
-- ----- --------
81 Bread 1
82 Soup 2
83 Ham 3
84 Eggs 4
position
列? 如何在插入新行时处理position
字段?
我自己还是一个 phpMyAdmin 男人,所以我需要简单地安排这个。
最初,我认为我可以像position
一样 auto_increment id
列 - 希望它可以作为我的初始订购位置 - 但是我显然不允许,因为只有id
。
我认为一旦我将位置列初始化并为新插入的行工作,那么转换它们应该不会太难?我想我会进行“交换”操作,将position
字段换成任意两行id
。
我想象一个“上移”或“下移”交换操作会抓住position
上方或下方的行,然后连续两次UPDATE..
来交换{{1} }}的。我不够酷,只想在一个查询中找出如何做到这一点(如果可能的话?),所以从PHP开始我会做多个查询来实现这一点。
我正在显示这样的购物清单:
position
我希望插入类似这样的新行:
SELECT * FROM groceries WHERE 1 ORDER BY position ASC;
如果我无法像INSERT INTO groceries (id, label, position)
VALUES (NULL, "Instant Noodles", NULL);
的自动增量那样自动执行position
字段,那么我应该将id
字段设置为什么,而不是'NULL'?如何插入position
与最后添加/最大位置+ 1相同的新行?
我应该运行另一个查询来获取最大的position
(或零)并添加1吗?
答案 0 :(得分:4)
由于您只能在表中设置一个auto_increment列,因此可以使用INSERT INTO...SELECT
语句来增加位置的最大值。
INSERT INTO groceries (label, position)
SELECT "Instant Noodles", COALESCE(MAX(position),0) +1
FROM groceries;
答案 1 :(得分:0)
JW向您展示了如何为新行提供最高价值。另一种方法是将默认值设置为0.这为字段提供了较少工作的值。