php SQLite学习笔记与常见问题分析第1/2页

   2015-11-18 0
核心提示:php SQLite学习资料收集,与一些常见问题的解决方法
直到学会! 学之前找资料
SQLite的sql
ATTACH DATABASE
BEGIN TRANSACTION
comment
COMMIT TRANSACTION
COPY
CREATE INDEX
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
DELETE
DETACH DATABASE
DROP INDEX
DROP TABLE
DROP TRIGGER
DROP VIEW
END TRANSACTION
EXPLAIN
expression
INSERT
ON CONFLICT clause
PRAGMA
REPLACE
ROLLBACK TRANSACTION
SELECT
UPDATE


sqlite常见问题
 (1) 如何建立自动增长字段?

简短回答:声明为 INTEGER PRIMARY KEY 的列将会自动增长。

长一点的答案: 如果你声明表的一列为 INTEGER PRIMARY KEY,那么, 每当你在该列上插入一NULL值时, NULL自动被转换为一个比该列中最大值大1的一个整数,如果表是空的, 将会是1。 (如果是最大可能的主键 9223372036854775807,那个,将键值将是随机未使用的数。) 如,有下列表:

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)SQLite3支持何种数据类型?

NULL
INTEGER
REAL
TEXT
BLOB
但实际上,sqlite3也接受如下的数据类型:
smallint  16 位元的整数。
interger  32 位元的整数。
decimal(p,s)  p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值    ,s是指小数点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。
float   32位元的实数。
double   64位元的实数。
char(n)   n 长度的字串,n不能超过 254。
varchar(n)  长度不固定且其最大长度为 n 的字串,n不能超过 4000。
graphic(n)  和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。   这个形态是为了支援两个字元长度的字体,例如中文字。
vargraphic(n)  可变长度且其最大长度为 n 的双字元字串,n不能超过 2000。
date   包含了 年份、月份、日期。
time   包含了 小时、分钟、秒。
timestamp  包含了 年、月、日、时、分、秒、千分之一秒。

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

(3)SQLite允许向一个integer型字段中插入字符串!

这是一个特性,而不是一个bug。SQLite不强制数据类型约束。任何数据都可以插入任何列。你可以向一个整型列中插入任意长度的字符串,向布尔型列中插入浮点数,或者向字符型列中插入日期型值。 在 CREATE TABLE 中所指定的数据类型不会限制在该列中插入任何数据。任何列均可接受任意长度的字符串(只有一种情况除外: 标志为INTEGER PRIMARY KEY的列只能存储64位整数,当向这种列中插数据除整数以外的数据时,将会产生错误。

但SQLite确实使用声明的列类型来指示你所期望的格式。所以,例如你向一个整型列中插入字符串时,SQLite会试图将该字符串转换成一个整数。如果可以转换,它将插入该整数;否则,将插入字符串。这种特性有时被称为 类型或列亲和性(type or column affinity).


--------------------------------------------------------------------------------

(4)为什么SQLite不允许在同一个表不同的两行上使用0和0.0作主键?

主键必须是数值类型,将主键改为TEXT型将不起作用。

每一行必须有一个唯一的主键。对于一个数值型列, SQLite认为 '0' 和 '0.0' 是相同的, 因为他们在作为整数比较时是相等的(参见上一问题)。 所以,这样值就不唯一了。


--------------------------------------------------------------------------------

(5)多个应用程序或一个应用程序的多个实例可以同时访问同一个数据库文件吗?

多个进程可同时打开同一个数据库。多个进程可以同时进行SELECT 操作,但在任一时刻,只能有一个进程对数据库进行更改。

SQLite 使用读、写锁控制对数据库的访问。(在Win95/98/ME等不支持读、写锁的系统下,使用一个概率性的模拟来代替。)但使用时要注意:如果数据库文件存放于一个NFS文件系统上,这种锁机制可能不能正常工作。 这是因为 fcntl() 文件锁在很多NFS上没有正确的实现。在可能有多个进程同时访问数据库的时候,应该避免将数据库文件放到NFS上。在Windows上,Microsoft的文档中说:如果使用 FAT 文件系统而没有运行 share.exe 守护进程,那么锁可能是不能正常使用的。那些在Windows上有很多经验的人告诉我:对于网络文件,文件锁的实现有好多Bug,是靠不住的。如果他们说的是对的,那么在两台或多台Windows机器间共享数据库可能会引起不期望的问题。

我们意识到,没有其它嵌入式的 SQL 数据库引擎能象 SQLite 这样处理如此多的并发。SQLite允许多个进程同时打开一个数据库,同时读一个数据库。当有任何进程想要写时,它必须在更新过程中锁住数据库文件。但那通常只是几毫秒的时间。其它进程只需等待写进程干完活结束。典型地,其它嵌入式的SQL数据库引擎同时只允许一个进程连接到数据库。

但是,Client/Server数据库引擎(如 PostgreSQL, MySQL, 或 Oracle)通常支持更高级别的并发,并且允许多个进程同时写同一个数据库。这种机制在Client/Server结构的数据库上是可能的,因为总是有一个单一的服务器进程很好地控制、协调对数据库的访问。如果你的应用程序需要很多的并发,那么你应该考虑使用一个Client/Server 结构的数据库。但经验表明,很多应用程序需要的并发,往往比其设计者所想象的少得多。

当SQLite试图访问一个被其它进程锁住的文件时,缺省的行为是返回 SQLITE_BUSY。 可以在C代码中使用 sqlite3_busy_handler() 或 sqlite3_busy_timeout() API 函数调整这一行为。
---------------------------------------------------------------------------
 
标签: SQLite 学习笔记
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • Rust 连接 SQLite 数据库
    Rust 连接 SQLite 数据库
    使用 Rust 语言连接操作 SQLite 数据库,我使用 rusqlite 这个 crate。看例子:首先,使用 cargo 创建一个 Rust 项目,然后添加依赖 rusqlite: 来到 main.rs,其余所有的代码都写在这里。首先引入 rusqlite 相关的类型,并建立一个 Person struct:Person
    02-09
  • delphi操作sqlite3
    Delphi SQLite 简明无废话上手指南SQLite下载http://www.sqlite.org/download.htmlSQLite FAQhttp://www.sqlitecn.org/faq.htmlSQLite中文论坛http://sqlite.com.cn/bbs/index.aspSQLite入门与分析http://www.cnblogs.com/hustcat/archive/2009/02/12/1389
    02-09
  • cocos2d-x 添加sqlite3 时 报 lua_Number 错误
    1 f:\cocos2d-x\cocos2d-x\external\lua\lua\lua.h(99) : 参见“lua_Number”的声明1f:\cocos2d-x\cocos2d-x\external\sqlite3-ext\lsqlite3.c(1272): error C2146: 语法错误: 缺少“;”(在标识符“n”的前面)1f:\cocos2d-x\cocos2d-x\external\sqlite3-ext\l
    02-09
  • 纯 Swift 封装的 SQLite 框架:SQLite.swift
    纯 Swift 封装的 SQLite 框架:SQLite.swift
    SQLite.swift 是一个使用纯 Swift 语言封装 SQLite3 的操作框架。特性:简单的查询和参数绑定接口安全、自动类型数据访问隐式提交和回滚接口开发者友好的错误处理和调试文档完善通过广泛测试示例代码:?1234567891011121314151617181920212223242526272829303
    02-09
  • DISQLite3 - A self-contained, embeddable, z
    DISQLite3 implements a self-contained, embeddable, zero-configuration SQL database engine for Delphi (Embarcadero / CodeGear / Borland).Features include:ACID transactions, even after system crashes and power failures.Zero-configuration
    02-09
  • 第十二篇、Swift_Sqlite的使用
     import UIKitclass SQLiteManager: NSObject {private static let manager: SQLiteManager = SQLiteManager()/// 单粒class func shareManager() -SQLiteManager {return manager}// 数据库对象private var db:COpaquePointer = nil// 创建一个串行队列priv
    02-08
  • electron + go 如何从sqlite获取数据
    electron + go 如何从sqlite获取数据
    electron + go 如何从sqlite获取数据2023-01-04 14:51 轩脉刃 阅读(0) 评论(0) 编辑 收藏 举报我现在的数据在sqlite中,保存在mac本地的一个文件中。用了electron+vue搭建了一个客户端。我大概希望是这样的逻辑,先加载本地db文件,然后再获取数据。这
    02-08
  • busybox filesystem httpd php-5.5.31 sqlite3 webserver
    busybox filesystem httpd php-5.5.31 sqlite3
    /******************************************************************** *busybox filesystem httpd php-5.5.31 sqlite3 webserver * 声明: * 本文主要是记录使用httpd、php5、sqlite3搭建php web服务器。 * * 2016-1-24 深圳 南山平山村 曾剑锋 *********
    02-08
  • cocos2dx lua bug之module 'lsqlite3'
    05-27 15:41:01.360: D/cocos2d-x debug info(7261): [LUA-print] ----------------------------------------05-27 15:41:01.360: D/cocos2d-x debug info(7261): [LUA-print] LUA ERROR: [string "src/bqsframework/GameUpdate.lua"]:41: module 'lsqlite3&#
    02-07
  • PHP+sqlite3验证登录用户名和密码
    php操作sqlite3数据库相关概念Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一
    10-31 SQLitePHP
点击排行