默认登录时,临时操作的是临时内存库,等退出的时候,创建的临时库以及表以及数据会被释放的,使用.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号 中国互联网协会会员