我会尝试尽可能简短地提出这个问题。我想知道是否有办法通过PHP& MySQL编码:
删除一个自动递增的id条目(比如第20条中的第12条),同时将其余条目降低1.(示例:删除条目12 ==条目13变为12,14变为13等等。)
手动(即通过表单)插入带有ID的条目,以便在用户指定的情况下向上推送其余条目(如果未指定任何内容,则默认为正常行为。(示例:用户指定他想要他的条目ID为14,但数据库中已有ID 14。应该发生的是用户输入将现有条目推送到15,其余现有条目遵循类似的方式。如果用户未指定ID,默认为正常行为。)
我还在学习MySQL& PHP和我需要的代码是一个我已经建立了一段时间的图像库系统。
是否可能?
答案 0 :(得分:4)
这实际上不是使用自动增量列的有效方法(数据库不是为此而设计的)。无论何时插入或移除项目,都可以有效地进行表格扫描。
如果您希望有一个可以随意插入的排序,最好保持一个单独的映射(例如,有一个单独的条目,存储您可以随意操作的ID列表)。
答案 1 :(得分:1)
对于任务1,您需要在修改所有ID后手动设置该表的AUTO_INCREMENT值,以便在下一次插入发生时没有间隙。更好的方法是根本不使用自动增量ID - 具有ID列,并使用MAX(id)+1在记录插入时查找所需的ID。
这是我的伪代码:
删除:
$n = 12;
DELETE from items where id='$n';
UPDATE items SET id=id-1 WHERE id > '$n'
指定插入:
$n = 15;
(if there is a record with id = 15)
UPDATE items SET id=id+1 WHERE id >= '$n'
INSERT into items (id,..) values ('$n',...)
表示未指定的插入
$n = SELECT MAX(id)+1 FROM items
INSERT into items (id,..) values ('$n',...)
答案 2 :(得分:0)
对于#1,请尝试以下SQL命令:
DELETE FROM table WHERE id=12;
UPDATE table set id=id-1 WHERE id > 12;
ALTER TABLE table AUTO_INCREMENT=AUTO_INCREMENT-1;
但是像这样使用ID字段是一个坏主意。将行插入表后,不应修改它的值。
答案 3 :(得分:0)
您可以将此用于1)问题。一起运行整个块。 @id应设置为您要删除的行。
SET @id = 12;
DELETE FROM tbl WHERE id = @id;
UPDATE tbl set id = id-1 WHERE id > @id;
ALTER TABLE tbl AUTO_INCREMENT = 0;
MySQL免责声明:您无法将计数器重置为小于或等于任何已使用过的值。对于MyISAM,如果该值小于或等于AUTO_INCREMENT列中当前的最大值,则该值将重置为当前最大值加1。对于InnoDB,您可以使用ALTER TABLE ... AUTO_INCREMENT =从MySQL 5.0.3开始的值,但如果该值小于列中的当前最大值,则不会发生错误,并且不会更改当前序列值。