MySQL中删除和增加数据后ID出现断层问题,如何让ID重新连续,代码是在MySQL中运行吗。可以有具体的运行步骤吗
ID的作用是什么,为什么要不断层。非要不断层,那删除中间某一条数据是很麻烦的,如果有关联,那还得要处理关联数据。
1. 附上mysql插入记录后返回自增id的方法链接
2. 出问题的存储过程
CREATE PROCEDURE `proc_test`(IN tname VARCHAR(255),IN tpwd VARCHAR(255),OUT reid INT)
BEGIN
INSERT INTO test (uname,upsd)VALUES(tname,tpwd);
SELECT max(uid) INTO reid FROM test;
END
运行测试之后,test数据表里成功多了一条记录,id也相应增加了,但返回值为null,最终发现返回null的原因是多个表中都存在名为uid的字段,而其它表中目前都为空,将uid改为 表名.字段名的形式后,问题解决,成功返回自增id。
3. 修改后的存储过程
CREATE PROCEDURE `proc_test`(IN tname VARCHAR(255),IN tpwd VARCHAR(255),OUT reid INT)
BEGIN
INSERT INTO test (uname,upsd)VALUES(tname,tpwd);
SELECT max(test.uid) INTO reid FROM test; #uid改为test.uid
END
这个只是非常简单基础的东西,至于高并发什么的,我目前没有遇到,还没有达到那个水平
好吧,虽然这个问题很蠢,但真的困扰了我很久,当时学数据库得时候并没有系统地学习,都是用到什么搜什么,用完就过去了,也不理解原理什么的,当时还用的是半吊子水平的C#+sql server, 这次老师突然又让用,还要求必须java+mysql,这两当年学的时候前者只了解了一下最基本的知识,多线程都没搞清楚,后者就没有用过,只能硬着头皮瞎搞了……
希望我这个小菜鸟少掉点头发!!!!
希望我能顺利毕业!!!
希望我接下来三年不要太痛苦!!!
哦~加油鸭!!!!!!
针对MySQL中删除或增加数据后出现ID断层的问题,可以采用以下几种方法:
方法一: 在删除数据后,重新设置自增ID的当前值。具体操作如下:
-- 假设book表的ID为自增字段
-- 删除数据(例如删除ID=3的记录)
DELETE FROM book WHERE ID=3;
-- 重新设置book表的ID值,让ID从最大值开始自增。若表中已经存在数据,则ID会自动从表中现有ID最大值+1的位置开始自增
ALTER TABLE book AUTO_INCREMENT=0;
方法二: 对于ID无法重复的表,可以在表结构中把ID字段设置为自增并且主键,这样每次插入数据时ID都会自动从当前最大值+1开始自增。具体操作如下:
ALTER TABLE node_table ADD id INT NOT NULL AUTO_INCREMENT PRIMARY KEY;
方法三: 对于有唯一ID且部分字段相同的记录查重,可以使用以下SQL语句进行查询:
SELECT *
FROM table_name
WHERE id IN (SELECT MAX(id) FROM table_name GROUP BY field1, field2, ...);
其中field1、field2等为需要去重的相同字段,MAX(id)表示以id字段为依据,取相同字段中id最大的一条数据。
方法四: MySQL根据双方的id进行分组并查询每组聊天记录中最新的一条数据,可以使用以下SQL语句进行查询:
SELECT me_id,you_id,content,time
FROM
(SELECT me_id,you_id,content,time
FROM message m
WHERE
(m.me_id IN(SELECT me_id as chat_id FROM message e WHERE e.you_id = 'test' UNION SELECT you_id as chat_id FROM message e WHERE e.me_id = 'test') AND m.you_id = 'test')
OR
(m.me_id='test' AND m.you_id IN(SELECT me_id as chat_id FROM message e WHERE e.you_id = 'test' UNION SELECT you_id as chat_id FROM message e WHERE e.me_id = 'test'))
ORDER BY time DESC LIMIT 999999) msg
GROUP BY msg.me_id+msg.you_id,ABS(msg.me_id-msg.you_id);
其中me_id、you_id为聊天双方的ID,content表示聊天内容,time表示聊天时间。SQL语句先查询与用户id为test聊过天的所有消息记录,然后根据聊天双方的id进行分组并查询每组聊天记录中最新的一条数据。如果id是字符串类型,则可以使用ASCII码进行相加减,具体可参考上述SQL语句注释。