最近将一个程序从Access修改为sqlite,需要调整的地方整理如下。
- Access 中可以直接使用数字开头的表名称, sqlite中不可以直接使用,表名要加双引号,例如 select *from "1table" (1table前后要加双引号, Access中不用加双引号)。
- sqlite中没有 now 函数,要用 datetime() 代替。
- Access 使用sql语句中使用 in [MS Access; database=***.mdb]来访问外部数据库,sqlite中要用 Attach database **.sdb as dbname语句先关联数据库,然后用 dbname.直接操作外部数据库,最后用 DETACH DATABASE dbname 取消附加数据库。
- Access建立表,自动增加字段是 Create Table tablename (ID IdEntity(1,1) PRIMARY KEY), sqlite中要用 Create Table tablename (ID INTEGER PRIMARY KEY AUTOINCREMENT)。
- Access 中的 select top 1 * from tablename, 在sqlite中要用 select * from limit 1
- sqlite的sql语句中没有 iff 函数,要使用 case when then end代替。
- sqlite的sql语句中没有switch 语句,要使用 case when then end代替。
- Access中可以修改表的类型,字段长度,sqlite中不可以,要修改需要建立一个临时表(字段类型、长度任意修改),将数据导入的临时表中,删除原来的表,将临时表改名。
- sqlite没有 isnull函数,用coalesce变通使用。
- Access 压缩数据库要用 CojetEngine.CompactDatabase(需要安装组件),sqlite只需要执行 vacuum 命令即可。
- Access 查询表是否存在的方法 select * from MySysObjects where type =1 and name=“表名”,而且需要在MySysObjects开通读取权限(默认是不开通的),sqlite使用 select * from sqlite_master where type ="表名"
- 获得最新插入数据的ID,ACCESS中使用 select @@IDENTITY,sqlite中使用 select LAST_INSERT_ROWID()。
- Access中的随机函数是 rnd(),sqlite中随机函数是 random()。
- Access中的in字句是大小写不敏感,sqlite中是大小写敏感的,需要用函数转化一下,SELECT * FROM LOWER(User)in('user1','user2');