「这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战」
描述
现有一张试卷作答记录表exam_record,其中包含多年来的用户作答试卷记录,结构如下表:
请删除exam_record表中所有记录,并重置自增主键。
后台会通过SELECT table_rows, auto_increment FROM information_schema.tables WHERE table_name='exam_record' 语句来对比输出结果
drop table if EXISTS exam_record;
CREATE TABLE IF NOT EXISTS exam_record (
id int PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
uid int NOT NULL COMMENT '用户ID',
exam_id int NOT NULL COMMENT '试卷ID',
start_time datetime NOT NULL COMMENT '开始时间',
submit_time datetime COMMENT '提交时间',
score tinyint COMMENT '得分'
)CHARACTER SET utf8 COLLATE utf8_general_ci;
TRUNCATE exam_record;
INSERT INTO exam_record(uid, exam_id, start_time, submit_time, score) VALUES
(1001, 9001, '2020-01-01 22:11:12', '2020-01-01 23:16:12', 50),
(1001, 9002, '2020-01-02 09:01:01', '2020-01-02 09:06:00', 58);
0|None
方法一
根据题意,删除表中所有数据,第一反应想到就是DELETE
,然而题中还有个条件,除了删除所有的记录外,还需要将主键重置;我们可以分为两步,第一步将表中数据删除;第二步,将主键重置;sql语句如下:
DELETE FROM exam_record;
ALTER TABLE exam_record auto_increment=1;
方法二
除了方法一外,我们还可以用另一种删除语法,TRUNCATE
,这种方式可以将表清空,并且包含了自增计数器重置。sql语句如下:
truncate table exam_record;
注意
truncate table 在功能上,与不带where字句的delete语句相同;二者均删除表中的全部行,但truncate table 比delete速度更快,且使用的系统和事务日志资源少。 truncate 删除表中的所有行,但表的结构及其列,约束,索引等保持不变。新行标识所用的技术值重置为该列的种子。如果想保留标识计数值,则应该用delete 。如果要删除表定义及其数据,则应该使用drop table 语句。从运行速度上面上来看,运行速度一般DROP最快,DELETE最慢,但是DELETE最安全。