1

大家好!我认为这不应该是一个非常困难的问题——但我对 MySQL 缺乏经验,并且一直在寻找正确的方法来做这件事。我不想最终做一些愚蠢的事情。

所以,我有一个杂货清单,我想改变它们的顺序。
  我希望它看起来像这样:

id    label    position
--    -----    --------
81    Bread    1
82    Soup     2
83    Ham      3
84    Eggs     4

如何position以这种方式初始化列?

position插入新行时如何处理该字段?
我自己仍然是一个phpMyAdmin人,所以我需要把它写得很简单。

最初,我想我可以像现在一样自动增加列-希望它可以作为我的初始排序位置 - 但我显然不允许,因为只有。positionidid

我认为一旦我初始化了位置列并为新插入的行工作,移动它们应该不会太难吗?我想我会做一个“交换”操作,将position任意两行的字段交换为id.
  我想一个“上移”或“下移”交换操作会抓住上面或下面的行's position,然后做两个连续UPDATE..的 's 来交换position's。我还不够酷,无法在一个查询中简单地弄清楚如何做到这一点(如果可能的话?),所以我将从 PHP 中执行多个查询来以蛮力完成此任务。


我正在显示这样的购物清单:
SELECT * FROM groceries WHERE 1 ORDER BY position ASC;


我希望插入这样的新行:

INSERT INTO groceries (id,    label,              position) 
VALUES                (NULL,  "Instant Noodles",  NULL);

如果我不能position像“自动增量”那样自动化该字段id,那么我应该/可以将position字段设置为什么而不是“NULL”?如何插入与position最后添加/最大位置+1 相同的新行?
  我是否应该运行另一个查询来获取最大position(或零)并加 1?

4

2 回答 2

4

由于您只能在一个表中设置一个 auto_increment 列,您可以使用INSERT INTO...SELECT语句来增加该位置的最大值。

INSERT INTO groceries (label, position) 
SELECT "Instant Noodles", COALESCE(MAX(position),0) +1
FROM groceries;
于 2013-03-10T22:49:59.757 回答
0

JW 向您展示了如何为新行赋予最高值。另一种方法是将默认值设置为 0。这为字段提供了一个工作量较少的值。

于 2013-03-10T22:54:08.213 回答