Tru*_*ufa 7 php mysql database
"大"更新:
好吧,我得到了整个自动增量点错误.我虽然这将是一个更容易的方法来定位第一,第二,第三等行,但这只是错误的方法.
你应该关心auto_increments是唯一的,并且它们会增加.你应该使用那个.
我不会删除这个问题,因为我认为对于有同样错误想法的其他人可能会有所帮助,但是要警告!:)
我有一个非常简单的MySQL表,它是这样的:
id comment user
1 hello name1
2 bye name2
3 hola name3
Run Code Online (Sandbox Code Playgroud)
然后我删除了两个第一条评论,结果如下:
id comment user
3 hola name3
Run Code Online (Sandbox Code Playgroud)
所以现在当我添加评论时:
id comment user
3 hola name3
5 chau name4
6 xxx name5
Run Code Online (Sandbox Code Playgroud)
我的问题是,我需要每当一行被删除时,它应该"重新开始",看起来像这样.
id comment user
1 hola name3
2 chau name4
3 xxx name5
Run Code Online (Sandbox Code Playgroud)
我想知道如何"重新启动"表,以便"始终"索引1,2,3等等.
提前致谢!!
我希望我已经清楚地解释了自己,我很抱歉所有的"普通英语",如果你认为一个词可能会令人困惑,请随时编辑:)请询问任何需要澄清的内容!
顺便说一句:我没有添加任何代码,因为这是一个简化的情况,虽然它更混乱,对其他人帮助不大,但我认为这有助于(或有必要)告诉我它!
假设没有外键问题需要处理,这段代码将执行此操作:
set @id:=0;
update mytable
set id = (@id := @id + 1)
order by id;
Run Code Online (Sandbox Code Playgroud)
如果存在外键问题,请确保在执行更新之前如此定义约束:
ALTER CHILD_TABLE ADD CONSTRAINT
FOREIGN KEY MYTABLE_ID REFERENCES MYTABLE
ON UPDATE CASCADE; -- This is the important bit
Run Code Online (Sandbox Code Playgroud)
完成后,执行此操作以修复auto_increment值:
SELECT MAX(ID) + 1 FROM MYTABLE; -- note the output
ALTER TABLE MYTABLE AUTO_INCREMENT = <result from above>;
Run Code Online (Sandbox Code Playgroud)
免责声明:我想不出一个有效的理由这样做,它可以打破非常糟糕的东西.但是,为了完整性和演示目的,我添加了这个.
你可以使用这个非常丑陋的解决方案,只有你在枪口下或者你的狗被扣为人质时才能这样做!
-- Create a new veriable.
SET @newId:=0;
-- Set all id's in the table to a new one and
-- also increment the counter in the same step.
-- It's basically just setting id to ++id.
UPDATE
yourTableHere
SET
id=@newId:=@newId+1;
-- Now prepare and execute an ALTER TABLE statement
-- which sets the next auto-increment value.
SET @query:=CONCAT("ALTER TABLE yourTableHere AUTO_INCREMENT=", @newId+1);
PREPARE sttmnt FROM @query;
EXECUTE sttmnt;
DEALLOCATE PREPARE sttmnt;
Run Code Online (Sandbox Code Playgroud)
这会将所有ID重置为表中行的位置.请注意,这会将行重新排序为MySQL如何从存储引擎获取它们,因此无法保证订单的任何方式.
如果你有一个基于Ids的系统(比如表之间的关系)那么你就会......好吧,假设我希望你有一个备份.