SQLite 中文指南之FAQ第1/6页

    1. 如何创建自增字段?
    2. SQLite 支持哪些数据类型?
    3. 为什么能向 SQLite 数据库的整型字段中插入字符串?
    4. 为什么 SQLite 认为表达式 ‘0’==’00’ 为真?
    5. 为什么 SQLite 不允许在同一张表里使用 ‘0’ 和 ‘0.0’ 作为两个不同的行的主键?
    6. 为什么不能在 Linux box 中读取在 SparcStation 中创建的 SQLite 数据库?
    7. 多个应用程序或者同一个应用程序的多个例程能同时存取同一个数据库文件吗?
    8. SQLite是线程安全的吗?
    9. 如何列出一个 SQLite 数据库中的所有的表/索引?
    10. SQLite数据库是否有已知的大小限制?
    11. 在 SQLite 中 VARCHAR 的最大长度是多少?
    12. SQLite 是否支持 BLOB 类型?
    13. 如何从一个已存在的 SQLite 数据表中添加/删除字段?
    14. 我删除了很多数据但是数据库文件并没有减小,是不是 Bug?
    15. 是否能将 SQLite 用于商业用途而不用交版权费用?
    16. 我如何使用含有单引号(‘)的字符串?
    17. SQLITE_SCHEMA 错误代表什么?
    18. 为什么ROUND(9.95,1) 返回 9.9 而不是 10.0? 难道9.95 不该向上进位么?

    (1) 如何创建自增字段?

    简单的回答:一个声明为 INTEGER PRIMARY KEY 的字段将自动增加。

    这里是详细的答案: 从 SQLite 的 2.3.4 版本开始,如果你将一个表中的一个字段声明为 INTEGER PRIMARY KEY,那么无论你何时向该表的该字段插入一个 NULL 值,这个 NULL 值将自动被更换为比表中该字段所有行的最大值大 1 的整数;如果表为空,那么将被更换为 1。比如,假设你有这样的一张数据表:

    CREATE TABLE t1(
    a INTEGER PRIMARY KEY,
    b INTEGER
    );

    在这张数据表里,声明

    INSERT INTO t1 valueS(NULL,123);

    在逻辑意义上等价于:

    INSERT INTO t1 valueS((SELECT max(a) FROM t1)+1,123);

    一个新的API函数 sqlite3_last_insert_rowid() 返回最近的插入操作的整形键

    注意这个整型键始终比之前插入表中的最后一个键大1。新键相对于表中的已有键来说是唯一的, 但它可能与之前从表中删除的键值重叠。要始终得到在整个表中唯一的键,在INTEGER PRIMARY KEY的声明之前加关键词AUTOINCREMENT.这样被选的键将总是比表中已存在的最大键大1。若可能的 最大键已存在于表中,INSERT操作将失败并返回一个SQLITE_FULL错误码.

    (2) SQLite 支持哪些数据类型?

    参见 http://www.sqlite.org/datatype3.html.

    (3) 为什么能向 SQLite 数据库的整型字段中插入字符串?

    这是一个功能,不是一个 bug。你可以在任何字段中放任何信息,而不用管字段声明为什么类型。 你可以往整型字段中插入任意长度的字符串,或者往布尔字段中插入浮点数,或者往字符字段中 插入日期。在 CREATE TABLE 命令中你指定给这个字段的数据类型不会限制插入这个字段的数据。 所有的字段可以插入任意长度的字符串。但对于 INTEGER PRIMARY KEY 字段例外。这种字段只能 存放一个64位的整数,否则会出错。

    但SQLite会默认你希望使用声明的字段类型。所以,比如你希望在一个声明为INTEGER的字段 中插入一个字符串,SQLite会试图将其转换为一个整数。如果转换成功,那么整数将被插入,否 则插入字符串,这种特性有时被称作type or column affinity.

Leave a Reply

Leave a Reply