默认登录时,临时操作的是临时内存库,等退出的时候,创建的临时库以及表以及数据会被释放的,使用.databases命令展示的时候会看到file列下面是null的没有数据库记录,如下所示: [root@localhost sqlite-autoconf-3080403]# sqlite3 SQLite version 3.8.4.3 2014-04-03 16:53:12 Enter ".help" for usage hints. Connected to a transient in-memory database. Use ".open FILENAME" to reopen on a persistent database. sqlite> .databases ---  ---------------  ---------------------------------------------------------- sqlite> sqlite> .tables sqlite> create table t1(id int); sqlite> insert into t1 select sqlite> insert into t1 select sqlite> select * from t1; sqlite> .table sqlite> 我们创建了一张表t1,并且录入了数据,退出后重新登录,表t1已经不存在了,如下所示: [root@localhost sqlite-autoconf-3080403]# sqlite3 SQLite version 3.8.4.3 2014-04-03 16:53:12 Enter ".help" for usage hints. Connected to a transient in-memory database. Use ".open FILENAME" to reopen on a persistent database. sqlite> .table sqlite> .tables sqlite> select * from t1; Error: no such table: t1 sqlite> 直接登录时候带上数据库名tim,就表示建库tim,注意:这时tim数据库确实已经创建好了注意:这时test.db数据库确实已经创建好了但是这时还是看不到这个数据库,还是个临时的,所以要输入SQL命令 ,等表格创建完后关闭sqlite3退出来的时候,就可以看到这个库了。 [root@localhost ~]# sqlite3 tim SQLite version 3.8.4.3 2014-04-03 16:53:12 Enter ".help" for usage hints. sqlite> .schema sqlite> CREATE TABLE test_auto_incre(id INT AUTO_INCREMENT primary key,msg_to VARCHAR(20), TYPE CHAR(1), create_date DATE  ); sqlite> .schema CREATE TABLE test_auto_incre(id INT AUTO_INCREMENT,msg_to VARCHAR(20), TYPE CHAR(1), create_date DATE,PRIMARY KEY (id) ); sqlite> .tables test_auto_incre sqlite> sqlite> exit ...> ; Error: near "exit": syntax error sqlite> 用.exit或者.quit退出来,或者使用CTRL+D 按钮退出sqlite命令行操作界面。
此时在sqlite3的安装根目录下,你就会看到tim库的文件夹,一般通常以库名字命名,如下所示 [root@localhost sqlite-autoconf-3080403]# ll -t total 11152 -rw-r--r-- 1 root root     3072 Aug 27 16:52 tim 再次登录进去查看已经存在的库以及表: sqlite> .databases ---  ---------------  ---------------------------------------------------------- /root/sqlite-autoconf-3080403/tim
sqlite> sqlite> .tables test_auto_incre
sqlite> (usernameid INTEGER DEFAULT 0, MesLocalID INTEGER, CreateTime INTEGER DEFAULT 0, Message TEXT, reservedInt INTEGER DEFAULT 0, reservedText TEXT,  PRIMARY KEY(usernameid,MesLocalID,CreateTime), tokenize=one_or_binary_tokenizer); sqlite> select  * from  fts_message_table_0 where fts_message_table_0 match '27'; Error: unknown tokenizer: one_or_binary_tokenizer sqlite> SQLite supports a limited subset of ALTER TABLE. The ALTER TABLE command in SQLite allows the user to rename a table or to add a new column to an existing table. It is not possible to rename a column, remove a column, or add or remove constraints from a table.
Sqlite 其实是不支持drop column的方法来删除列的
(1).根据原表创建一张新表 create table test_tmp(id integer primary key, username text default ‘’);这个表没有列address了。 (2).从原来表把数据录入新临时表, sqlite> insert into test_tmp select id,username from test; sqlite> select * from test_tmp; sqlite> (3).删除原表 sqlite> drop table if exists test; (4).将新临时表重名为旧表的名称 sqlite> alter table test_tmp rename to test; sqlite> select * from test; sqlite> 这样就实现了,删除一个字段address,得到了我们想要的drop column的目的了。
PS:不建议create table test_tmp as select id, username from test;的方式建立临时表,因为这样的话,主键约束就不存在了。 CREATE TABLE test_auto_incre(id INT AUTO_INCREMENT,msg_to VARCHAR(20), TYPE CHAR(1), create_date DATE,PRIMARY KEY (id) ); CREATE TABLE "test"(id integer primary key, username text default ‘’, addr varchar(60) not null default ''); CREATE INDEX idx_username on test(username); CREATE INDEX idx_addr on test(addr,username); CREATE UNIQUE INDEX idx_unaddr on test(addr); CREATE TABLE test_auto_incre(id INT AUTO_INCREMENT,msg_to VARCHAR(20), TYPE CHAR(1), create_date DATE,PRIMARY KEY (id) ); sqlite> sqlite> .header on –加上显示的表头列名 sqlite> select * from sqlite_master; type|name|tbl_name|rootpage|sql table|test|test|4|CREATE TABLE "test"(id integer primary key, username text default ‘’, addr varchar(60) not null default '') index|idx_username|test|2|CREATE INDEX idx_username on test(username) index|idx_addr|test|5|CREATE INDEX idx_addr on test(addr,username) index|idx_unaddr|test|6|CREATE UNIQUE INDEX idx_unaddr on test(addr) table|test_auto_incre|test_auto_incre|7|CREATE TABLE test_auto_incre(id INT AUTO_INCREMENT,msg_to VARCHAR(20), TYPE CHAR(1), create_date DATE,PRIMARY KEY (id) ) index|sqlite_autoindex_test_auto_incre_1|test_auto_incre|8| sqlite> table|test_auto_incre|test_auto_incre|7|CREATE TABLE test_auto_incre(id INT AUTO_INCREMENT,msg_to VARCHAR(20), TYPE CHAR(1), create_date DATE,PRIMARY KEY (id) ) sqlite> 方法二:使用.schema命令 sqlite> .schema test_auto_incre CREATE TABLE test_auto_incre(id INT AUTO_INCREMENT,msg_to VARCHAR(20), TYPE CHAR(1), create_date DATE,PRIMARY KEY (id) ); sqlite> sqlite> .schema test CREATE TABLE "test"(id integer primary key, username text default ‘’, addr varchar(60) not null default ''); CREATE INDEX idx_username on test(username); CREATE INDEX idx_addr on test(addr,username); CREATE UNIQUE INDEX idx_unaddr on test(addr); sqlite> CREATE VIRTUAL TABLE fts_message_table_0_tmp USING fts3(usernameid INTEGER DEFAULT 0, MesLocalID INTEGER, CreateTime INTEGER DEFAULT 0, Message TEXT, reservedInt INTEGER DEFAULT 0, reservedText TEXT,  PRIMARY KEY(usernameid,MesLocalID,CreateTime)); CREATE TABLE test(id INT AUTO_INCREMENT,msg_to VARCHAR(20), TYPE CHAR(1), create_date DATE,PRIMARY KEY (id) ); INSERT INTO test(msg_to,TYPE,create_date) SELECT 'm1','a','2014-08-18 12:12:23'; INSERT INTO test(msg_to,TYPE,create_date) SELECT 'm1','b','2014-08-18 13:12:23'; INSERT INTO test(msg_to,TYPE,create_date) SELECT 'm1','c','2014-08-18 10:12:23'; 命令:.import FILE TABLE     Import data from FILE into TABLE
建立了Sqlite数据库后就要建立表输入数据了,多数时候数据量较大,手动输入不可能,必须用导入语句,导入逗号分隔csv格式数据,首先建立一个表,比如test.db中建表test,如果表已经存在,可以利用命令".schema"查看该表结构,比如:
sqlite>.schema test,结果得到test表的结构,因为要导入的数据必须具有相似的结构,所以必须明了目标表的结构。 sqlite> .schema test CREATE TABLE test(id integer default 0, username text); sqlite>
比如test表具有下面的数据
另一个csv文本文件为 test.csv,内容如下:
注意1: 不要忘了开头的点.import 注意2: 这条语句不能用分号结束. 非SQL不需要分号结束. 注意3: 需要查看默认的分隔符separator. 必须一致,查看分隔符使用命令.show,如果不一致可能导致sqlite字段分割错误,利用”.separator”命令转换sqlite默认分隔符,比如.separator ","这一句就将分隔符改变为逗号,与预导入数据一致才能顺利导入,如下所示: sqlite> .show echo: eqp: off explain: off headers: off mode: nullvalue: "" output: stdout separator: "|" stats: off width: sqlite> 分隔符不是”|”,而文件test.csv的分隔符是”,”,所以要先转换分隔符,在导入: sqlite> .separator "," sqlite> .table test_auto_incre sqlite> .import test.csv test 导入成功,查看结果 sqlite> select * from test; sqlite> .separator "|" sqlite> select * from test; sqlite>
这样表test就多了从csv文件导入的两行记录,sqlite最新版本已经默认使用事件,因此海量数据导入也很轻松高效,同样的方法可以导入海量txt文本文件。
5.2,数据导出.output命令 命令: .output FILENAME       Send output to FILENAME sqlite> .output a.txt 然后输入sql语句, 查询出要导的数据. 查询后,数据不会显示在屏幕上,而直接写入文件. 结束后,输入 sqlite> .output stdout 将输出重定向至屏幕,如下所示: [root@localhost sqlite-autoconf-3080403]# [root@localhost sqlite-autoconf-3080403]# sqlite3 ti SQLite version 3.8.4.3 2014-04-03 16:53:12 Enter ".help" for usage hints. sqlite> sqlite> .output test.sql sqlite> select * from test; sqlite> .exit [root@localhost sqlite-autoconf-3080403]# more test.sql [root@localhost sqlite-autoconf-3080403]#

广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员