清空SQL数据库后怎么让序列ID重1开始排列

清空SQL数据库后怎么让序列ID重1开始排列,第1张

方法和详细的 *** 作步骤如下:

1、第一步,可以看到一条新记录已添加到mysql数据库表中,ID为59818,但显然只有一条记录,见下图,转到下面的步骤。

2、第二步,完成上述步骤后,可以通过“truncate table 表名”重置空ID,以使ID自动从1开始增加,见下图,转到下面的步骤。

3、第三步,完成上述步骤后,运行“

 truncate table crew_test”语句,以重建空的crew_test表ID,见下图,转到下面的步骤。

4、第四步,完成上述步骤后,再次打开crew_test表并添加两个新记录,可以看到id从1开始增加,见下图。这样,以上的问题就解决了。

在Android中可以使用Eclipse插件DDMS来查看,也可以使用Android工具包中的adb工具来查看。android项目中的sqlite数据库位于/data/data/项目包/databases中。

使用DDMS导出sqlite数据库。

1、首先打开android项目的调试模式,然后找到显示DDMS:

选择DDMS

2、切换到DDMS,显示FileExplorer窗口,找到/data/data/

然后找到程序包的文件夹,打开databases,就能看到sqlite数据库文件了。选择将其导出。

这样就把sqlite数据库文件以文件的方式导出来了,然后使用sqlite界面管理工具如sqliteadministrator、sqliteman或者firefox插件sqlitemanager等打开就可以了。

使用adb工具访问sqlite数据库

AndroidDebugBridge(ADB)是Android的一个通用调试工具,它可以更新设备或模拟器中的代码,可以管理预定端口,可以在设备上运行shell命令,我们知道android是基于Linux内核,它的内部文件结构也是采用linux文件组织方式,因此访问它的文件结构需要使用shell。这次我们就会用shell来访问android应用中的sqlite数据库文件。

1、运行cmd,切换到android-sdk目录,运行adbexe,加上参数shell,出现#号就代表进入了shell命令模式,注意adb要在Android模拟器运行时才能进入shell:

2、shell命令记住两个基本命令ls和cd,类似windows命令提示行中的dir和cd,代表列出当前目录下文件列表和进入到指定目录。了解这两个命令之后,就可以找到data/data/项目包名/databases:

找到数据库文件:

接下来就是使用sqlite管理工具来进行 *** 作了。键入sqlite3数据库名就进入了sqlite管理模式了。

在android的sdk中自带了sqlite3exe,这是sqlite的官方管理工具,它是一个命令行工具。为了使用方便,将其路径注册到系统环境变量path中,即将;%Android_Home%加在Path中,这样只样运行sqlite3,就能直接打开sqlite管理工具了。

sqlite管理数据库篇

sqlite命令行工具默认是以;结束语句的。所以如果只是一行语句,要在末尾加;,或者在下一行中键入;,这样sqlite命令才会被执行。

sqlite常用命令:

tables--查看数据库的表列表

exit--退出sqlite命令行

SQLite创建的数据库有一种模式IN-MEMORY,但是它并不表示SQLite就成了一个内存数据库。IN-MEMORY模式可以简单地理解为,(2020 表述勘误:本来创建的数据库文件是基于磁盘的,现在整个文件使用内存空间来代替磁盘空间,没有了文件作为backingstore,不必在修改数据库后将缓存页提交到文件系统),其它 *** 作保持一致。也就是数据库的设计没有根本改变。

inmemory与tempdb是两种节约模式,节约的对象为(rollback)日志文件以及数据库文件,减少IO。inmemory将日志写在内存,并且去除数据库文件作为backingStore,缓存页不用提交到文件系统。tempdb只会在只会在脏的缓存页超过当前总量的25%才会同步刷写到文件,换句话说在临时数据库模式下,事务提交时并不总同步脏页,因此减少了IO数量,事务日志也受这种机制影响,所以在临时数据库模式下,事务日志是不是MEMORY并不重要。回过头来看,内存模式则是临时模式的一种极致,杜绝所有的IO。这两种模式都只能存在一个sqlite3连接,关闭时销毁。

提到内存,许多人就会简单地理解为,内存比磁盘速度快很多,所以内存模式比磁盘模式的数据库速度也快很多,甚至有人望文生意就把它变成等同于内存数据库。

它并不是为内存数据库应用而设计的,本质还是文件数据库。它的数据库存储文件有将近一半的空间是空置的,这是它的B树存储决定的,(2020 勘误:对于固定长度记录,页面使用率最大化,对于非自增计数键的索引,页面一般会保留20~60%的空间,方便插入)请参看上一篇SQLite存储格式。内存模式只是将数据库存储文件放入内存空间,但并不考虑最有效管理你的内存空间,其它临时文件也要使用内存,事务回滚日志一样要生成,只是使用了内存空间。它的作用应该偏向于临时性的用途。

(2020 补充:下面的测试有局限性,)

我们先来看一下下面的测试结果,分别往memory和disk模式的sqlite数据库进行1w, 10w以及100w条数据的插入,采用一次性提交事务。另外使用commit_hook捕捉事务提交次数。

(注:测试场景为在新建的数据库做插入 *** 作,所以回滚日志是很小的,并且无需要在插入过程中查找而从数据库加载页面,因此测试也并不全面)

内存模式

磁盘模式

在事务提交前的耗时 (事务提交后的总耗时):

1w 10w 100w

内存模式 004s 035s 360s

磁盘模式 006s (027s) 047s (072s) 395s (462s)

可以看到当 *** 作的数据越少时,内存模式的性能提高得越明显,事务IO的同步时间消耗越显注。

上图还有一组数据比较,就是在单次事务提交中,如果要为每条插入语句准备的话

1w 10w 100w

内存模式 019s 192s 1946s

磁盘模式 021s (035s) 206s (226s) 1988s (2041s)

我们从SQLite的设计来分析,一次插入 *** 作,SQLite到底做了些什么。首先SQLite的数据库 *** 作是以页面大小为单位的。在单条记录插入的事务中,回滚日志文件被创建。在B树中查找目标页面,要读入一些页面,然后将目标页面以及要修改的父级页面写出到回滚日志。 *** 作目标页面的内存映像,插入一条记录,并在页面内重排序(索引排序,无索引做自增计数排序,参看上一篇《SQLite数据库存储格式》)。最后事务提交将修改的页面写出到数据库文件,成功后再删除日志文件。在这过程中显式进行了2次写磁盘(1次写日志文件,1次同步写数据库),还有2次隐式写磁盘(日志文件的创建和删除),这是在 *** 作目录节点。以及为查找加载的页面读 *** 作。更加详细可以参看官方文档的讨论章节《Atomic Commit In SQLite》。

如果假设插入100条记录,每条记录都要提交一次事务就很不划算,所以需要批量 *** 作来减少事务提交次数。假设页面大小为4KB,记录长度在20字节内,每页可放多于200条记录,一次事务提交插入100条记录,假设这100条记录正好能放入到同一页面又没有产生页面分裂,这样就可以在单条记录插入事务的IO开销耗损代价中完成100条记录插入。

当我们的事务中,插入的数据越多,事务的IO代价就会摊得越薄,所以在插入100w条记录的测试结果中,内存模式和磁盘模式的耗时都十分接近。实际应用场合中也很少会需要一次插入100w的数据。有这样的需要就不要考虑SQLite。

(补充说明一下,事务IO指代同步数据库的IO,以及回滚日志的IO,只在本文使用)

除了IO外,还有没有其它地方也影响着性能。那就是语句执行。其实反观一切,都是在对循环进行优化。

for (i = 0; i < repeat; ++i)

{

exec("BEGIN TRANS");

exec("INSERT INTO ");

exec("END TRANS");

}

批量插入:

exec("BEGIN TRANS");

for (i = 0; i < repeat; ++i)

{

exec("INSERT INTO ");

}

exec("END TRANS");

当我们展开插入语句的执行

exec("BEGIN TRANS");

for (i = 0; i < repeat; ++i)

{

// unwind exec("INSERT INTO ");

prepare("INSERT INTO ");

bind();

step();

finalize();

}

exec("END TRANS");

又发现循环内可以移出部分语句

exec("BEGIN TRANS");

// unwind exec("INSERT INTO ");

prepare("INSERT INTO ");

for (i = 0; i < repeat; ++i)

{

bind();

step();

}

finalize();

exec("END TRANS");

这样就得到了批量插入的最终优化模式。

所以对sql语句的分析,编译和释放是直接在损耗CPU,而同步IO则是在饥饿CPU。

请看下图

分别为内存模式1w和10w两组测试,每组测试包括4项测试

1只编译一条语句,只提交一次事务

2每次插入编译语句,只提交一次事务

3只编译一条语句,但使用自动事务。

4每次插入编译语句,并使用自动事务。

可以看到测试项目4基本上就是测试项目2和测试项目3的结果的和。

测试项目1就是批量插入优化的最终结果。

下面是探讨内存模式的使用:

经过上面的分析,内存模式在批量插入对比磁盘模式提升不是太显注的,请现在开始关注未批量插入的结果。

下面给出的是磁盘模式01w和02w两组测试,每组测试包括4项测试

可以看到在非批量插入情况,sqlite表现很差要100秒来完成1000次单条插入事务,但绝非sqlite很吃力,因为cpu在空载,IO阻塞了程序。

再来看内存模式20w测试

可以看到sqlite在内存模式,即使在20w次的单条插入事务,其耗时也不太逊于磁盘模式100w插入一次事务。

01w 02w 20w

内存模式(非批量插入) 1587s

磁盘模式(非批量插入) 974s 19828s

编译1次插入语句 每次插入编译1次语句

内存模式(20w,20w次事务) 1110s 1587s

磁盘模式(100w,1次事务) 462s 2041s

Android 连接数据库

Android采用关系型数据库SQLite3,它是一个支持SQL轻量级的嵌入式数据库,在嵌入式 *** 作上有很广泛的,WM采用的也是SQLite3

关于过于、原理方面的东西在这篇文章里不会提到,但是如果你想能够快速的学会 *** 作SQLite3,那这就是你要找的文章!

首先,我们看一下api,所有数据库相关的接口、类都在database和androiddatabasesqlite两个包下,虽然只有两个包,但是如果你英文不好或是太懒的话也要迷茫一段时间,其实,我们真正用的到的没有几个!

1、SQLiteOpenHelper (androiddatabasesqliteSQLiteOpenHelper)

这是一个抽象类,关于抽象类我们都知道,如果要使用它,一定是继承它!

这个类的方法很少,有一个构造方法

SQLiteOpenHelper(androidcontentContext context, javalangString name,androiddatabasesqliteSQLiteDatabaseCursorFactory factory, int version);

参数不做过多的解释,CursorFactory一般直接传null就可以

public void onCreate(SQLiteDatabase db)

此方法在创建数据库是被调用,所以,应该把创建表的 *** 作放到这个方法里面,一会儿在后面我们会再详细的说如何创建表

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

从方法名上我们就能知道这个方法是执行更新的,没错,当version改变是系统会调用这个方法,所以在这个方法里应该执行删除现有表,然后手动调用onCreate的 *** 作

SQLiteDatabase getReadableDatabase()

可读的SQLiteDatabase对象

SQLiteDatabase getWritableDatabase()

获取可写的SQLiteDatabase对象

2、SQLiteDatabase(androiddatabasesqliteSQLiteDatabase)

关于 *** 作数据库的工作(增、删、查、改)都在这个类里

execSQL(sql)

执行SQL语句,用这个方法+SQL语句可以非常方便的执行增、删、查、改

除此之外,Android还提供了功过方法实现增、删、查、改

long insert(TABLE_NAME, null, contentValues)添加记录

int delete(TABLE_NAME, where, whereValue)删除记录

int update(TABLE_NAME, contentValues, where, whereValue) 更新记录

Cursor query(TABLE_NAME, null, null, null, null, null, null) 查询记录

除此之外,还有很多方法,如:beginTransaction()开始事务、endTransaction()结束事务有兴趣的可以自己看api,这里就不多赘述了

3、Cursor(androiddatabaseCursor)

游标(接口),这个很熟悉了吧,Cursor里的方法非常多,常用的有:

boolean moveToPosition(position)将指针移动到某记录

getColumnIndex(ContactsPeopleNAME)按列名获取id

int getCount()获取记录总数

boolean requery()重新查询

boolean isAfterLast()指针是否在末尾

boolean isBeforeFirst()时候是开始位置

boolean isFirst()是否是第一条记录

boolean isLast()是否是最后一条记录

boolean moveToFirst()、 boolean moveToLast()、 boolean moveToNext()同moveToPosition(position)

4、SimpleCursorAdapter(androidwidgetSimpleCursorAdapter)

也许你会奇怪了,之前我还说过关于数据库的 *** 作都在database和databasesqlite包下,为什么把一个Adapter放到这里,如果你用过Android的SQLite3,你一定会知道

,这是因为我们对数据库的 *** 作会经常跟列表联系起来

经常有朋友会在这出错,但其实也很简单

SimpleCursorAdapter adapter = new SimpleCursorAdapter(

this,

Rlayoutlist,

myCursor,

new String[] ,

new int[]);

mysetAdapter(adapter);

一共5个参数,具体如下:

参数1:Content

参数2:布局

参数3:Cursor游标对象

参数4:显示的字段,传入String[]

参数5:显示字段使用的组件,传入int[],该数组中是TextView组件的id

到这里,关于数据库的 *** 作就结束了,但是到目前为止我只做了翻译的工作,有些同学可能还是没有掌握,放心,下面我们一起顺着正常开发的思路理清一下头绪!

前面的只是帮没做过的朋友做下普及,下面才是你真正需要的!

一、写一个类继承SQLiteOpenHelpe

public class DatabaseHelper extends SQLiteOpenHelper

构造方法:

DatabaseHelper(Context context) {

super(context, DATABASE_NAME, null, DATABASE_VERSION);

}

在onCreate方法里写建表的 *** 作

public void onCreate(SQLiteDatabase db) {

String sql = "CREATE TABLE tb_test (_id INTEGER DEFAULT '1' NOT NULL PRIMARY KEY AUTOINCREMENT,class_jb TEXT NOT NULL,class_ysbj TEXT NOT NULL,title TEXT NOT NULL,content_ysbj TEXT NOT NULL)";

dbexecSQL(sql);//需要异常捕获

}

在onUpgrade方法里删除现有表,然后手动调用onCtreate创建表

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

String sql = "drop table "+tbname;

dbexecSQL(sql);

onCreate(db);

}

对表增、删、查、改的方法,这里用的是SQLiteOpenHelper提供的方法,也可以用sql语句实现,都是一样的

关于获取可读/可写SQLiteDatabase,我不说大家也应该会想到,只有查找才会用到可读的SQLiteDatabase

/

添加数据

/

public long insert(String tname, int tage, String ttel){

SQLiteDatabase db= getWritableDatabase();//获取可写SQLiteDatabase对象

//ContentValues类似map,存入的是键值对

ContentValues contentValues = new ContentValues();

contentValuesput("tname", tname);

contentValuesput("tage", tage);

contentValuesput("ttel", ttel);

return dbinsert(tbname, null, contentValues);

}

/

删除记录

@param _id

/

public void delete(String _id){

SQLiteDatabase db= getWritableDatabase();

dbdelete(tbname,

"_id=",

new String[]);

}

/

更新记录的,跟插入的很像

/

public void update(String _id,String tname, int tage, String ttel){

SQLiteDatabase db= getWritableDatabase();

ContentValues contentValues = new ContentValues();

contentValuesput("tname", tname);

contentValuesput("tage", tage);

contentValuesput("ttel", ttel);

dbupdate(tbname, contentValues,

"_id=",

new String[]);

}

/

查询所有数据

@return Cursor

/

public Cursor select(){

SQLiteDatabase db = getReadableDatabase();

return dbquery(

tbname,

new String[],

null,

null, null, null, "_id desc");

}

关于dbquery方法的参数,有很多,为了防止大家弄乱,我简单说一下

参数1:表名

参数2:返回数据包含的列信息,String数组里放的都是列名

参数3:相当于sql里的where,sql里where后写的内容放到这就行了,例如:tage>

参数4:如果你在参数3里写了(知道我为什么写tage>了吧),那个这里就是代替的值 接上例:new String[]

参数5:分组,不解释了,不想分组就传null

参数6:having,想不起来的看看SQL

参数7:orderBy排序

到这里,你已经完成了最多的第一步!我们来看看都用到了那些类:

SQLiteOpenHelper我们继承使用的

SQLiteDatabase增删查改都离不开它,即使你直接用sql语句,也要用到execSQL(sql)

二、这里无非是对DatabaseHelper类定义方法的调用,没什么可说的,不过我还是对查询再唠叨几句吧

Android查询出来的结果一Cursor形式返回

cursor = sqLiteHelperselect();//是不是很简单

查询出来的cursor一般会显示在listView中,这就要用到刚才提到的SimpleCursorAdapter

SimpleCursorAdapter adapter = new SimpleCursorAdapter(

this,

Rlayoutlist_row,

cursor,

new String[],

new int[]

);

你好:

利用Navicat创建SQLite数据库

步骤一、打开Navicat,点击文件,选择新建连接,选择SQLite,d出界面,在连接名输入连接名称,类型根绝需要选择,若选现有的数据库文件,则需要在数据库文件选项中,找到相应的SQLite数据库文件,若选其他类型,则会新建一个数据库连接,需要在数据库文件选项,选择保存位置(SQLite与SQLite3两个版本)。下文连接名为SQLiteOperate,类型为SQLite3,数据库名为testdb,默认有一个数据库main。高级、>

可以使用SQLite转换工具将SQLite数据导出为MySQL格式,步骤如下:

首先,在MySQL服务器上创建一个新的空数据库。

然后,使用SQLite转换工具将SQLite数据库文件导出为MySQL格式的文本文件。

最后,在MySQL服务器上使用LOAD DATA INFILE语句将导出的MySQL格式文件导入到新建的数据库中。

NineData是一款非常有特色的数据库SQL开发产品,对MySQL常用功能支持非常完整,包括智能的SQL补全、SQL执行历史、结果集编辑、数据对比、结构对比、数据迁移与复制等。它采用SaaS架构模式,用户不仅可以直接使用,而且无需下载安装,上手比较简单。NineData产品更新迭代比较敏捷,对于开发者的新需求响应比较迅速。另外,该产品在多云适配上是其重要的强项,支持多种连接和访问云数据库的方式,对阿里云、腾讯云、华为云、AWS等都有比较好的支持。另外,也适配国内比较流行的PolarDB、GaussDB、TDSQL等数据库。

路过,顺便试了下,可以的啊!

root@DPtech /proc$ sqlite3

SQLite version 3611

Enter "help" for instructions

Enter SQL statements terminated with a ";"

sqlite> create table tb(id integer, value text);

sqlite> insert into tb(id) values(1);

sqlite> insert into tb values(2, '22');

sqlite> select from tb;

1|

2|22

sqlite> select from tb where value isnull;

1|

sqlite>

以上就是关于清空SQL数据库后怎么让序列ID重1开始排列全部的内容,包括:清空SQL数据库后怎么让序列ID重1开始排列、Android开发怎么查看和管理sqlite数据库、sqlitememory原理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10167149.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存