SQLite的一个触发器实例3

本文探讨了SQLite中主键允许NULL值的情况,强调在建表时设置NOT NULL的重要性,以及NULL值在运算中的特殊性。通过示例代码展示了NULL值的处理和测试。
摘要由CSDN通过智能技术生成
对于SQLite和SQLite的触发器,我先说一些结果吧:

01. SQLite不支持赋值操作,自然也没有变量之说。

建表时,如果不指定 NOT NULL 的话,主键和联合主键的字段是可以插入NULL值的。

建表时,强烈建议主键/联合主键是NOT NULL的,在SQLite中,主键为NULL的数据行可以重复插入:

CREATE TABLE kv(
k TEXT NULL PRIMARY KEY,
v TEXT NULL
);
SELECT * FROM kv;
REPLACE INTO kv(k,v)VALUES(NULL,'value_of_NULL'),('key','value');

02. NULL与任何数据进行运算,结果都是NULL。ISNULL和NOTNULL应该不是运算符。请执行下面的语句进行测试:

SELECT 1=NULL, 1!=NULL, NULL=NULL, NULL!=NULL, NULL ISNULL, NULL IS NULL, NULL NOTNULL;

03. 在CASE-WHEN-THEN-ELSE-END语句中,THEN后面可以接SELECT语句,但是没法接INSERT/REPLACE/UPDATE语句,貌似因为它们没有返回值。
04. SQLite没有FLOOR函数、CEIL函数、POWER函数、等函数。
05. 当你对SQLite有什么猜想需要验证时,不要用NavicatForSQLite进行验证,建议使用SQLiteStudio,至少我还没有发现SQLiteStudio异常的地方。(注:Navicat里面可以对SQLite执行POWER和FLOOR等函数,但是原生的SQLite不支持它们。触发器的某些写法在Navicat里面创建失败,但是用SQLite官网提供的程序就可以创建成功)。
06. 触发器里面无法使用IF-ELSE语句。
07. 触发器里面无法创建临时表。
08. 触发器在进行递归调用时,会报错(Error while executing SQL query on database 'test.sqlite3': too many levels of trigger recursion),并没有陷入死循环中,这个挺好。(验证方式:给一个数据表创建两个UPDATE OF触发器,一个是字段A的触发器,它会更新字段B,一个是字段B的触发器,它会更新字段A,然后外部用UPDATE语句驱动程序进入这个死循环,查看结果)。
09. 行级触发器里面的NEW和OLD是某行数据的引用。引用的值在触发器的本次调用过程中不会改变(在本次调用过程中,即使我UPDATE了某个字段的值,NEW中的这个字段的值也不会改变/实时更新)。(验证方式:自己创建一个数据表和一个日志表,创建一个数据表的触发器,将NEW的所有字段的值写进日志表,修改某个字段的值,再将NEW的所有字段的值写进日志表)。
10. 对于UPDATE语句(UPDATE 表名 SET field_1=value_1,field_2=value_2,... WHERE 条件;),不论这个UPDATE语句同时SET了多少字段,如果它仅仅修改了一行,那么UPDATE的FOR EACH ROW触发器仅调用一次。(验证方式:自己创建一个数据表和一个日志表,创建一个数据表的触发器,触发器中往日志表中写进NEW的所有值,往数据表里INSERT几行数据,然后UPDATE某一行字段的几个值)。
11. 触发器的调用顺序,貌似是对触发器按照名字排序,然后逐个调用。(验证方式:一个数据表创建两个AFTER INSERT触发器,触发器里面往日志表中写消息,往数据表中INSERT一行数据,查看日志表,对触发器改名,再尝试一次)。
下面是一个实战的例子:
说明:不建议按照这个例子的写法进行作业,这样做的话,可读性和可维护性不好,各个表之间是强耦合的,后期有改动的话,可能会牵一发而动全身。
本例则主要内容:股票数据存储在两个文件中,我需要将这俩文件存储到raw_data_1和raw_data_2中,然后利
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值