0

0

Sqlite3中replace语句用法详解

php中文网

php中文网

发布时间:2016-06-07 16:21:37

|

1246人浏览过

|

来源于php中文网

原创

由于自己的孤陋寡闻, 也由于之前的项目中, 很少参与过数据库模块的开发, 以至于前几天才知道Sqlite数据库也支持replace语句。 本文主要讲解在Sqlite中replace语句的行为,也算是学习笔记。此外, replace语句和update语句有相似的地方, 但是也有很多不同

   由于自己的孤陋寡闻, 也由于之前的项目中, 很少参与过数据库模块的开发, 以至于前几天才知道sqlite数据库也支持replace语句。 本文主要讲解在sqlite中replace语句的行为,,也算是学习笔记。此外, replace语句和update语句有相似的地方, 但是也有很多不同之处。 本文还要对比一下sqlite中的 replace语句和update语句 。

  在本例中使用如下数据库表:

Sqlite3中replace语句用法详解    三联

  (图 1)

  该表的表名为student, 存储学生信息。 所有字段的数据类型都是TEXT 。 其中id和name作为复合主键。 email字段加上了唯一约束。建表语句如下:

?

1

2

3

4

5

6

7

8

9

10

CREATE TABLE IF NOT EXISTS student (

        "id"  TEXT,

        "name"  TEXT NOT NULL,

        "sex"  TEXT,

        "email"  TEXT UNIQUE,

        "fenshu"  TEXT CHECK(fenshu > 0),

        "tecid"  TEXT REFERENCES teacher(id),

        "class"  TEXT,

        PRIMARY KEY(id, name)

        )

  replace语句的行为

  1 replace语句会删除原有的一条记录, 并且插入一条新的记录来替换原记录。

  为了验证这个结论, 下面打开Sqlite命令行, 执行以下语句来替换id为2的记录。

?

1

2

sqlite> replace into student (id, name, sex, email, fenshu, tecid, class) values

 ('2', 'lisi', '*F', '123456@qq.com', '80', '2', '1');

  执行完这条语句之后, student表中的数据变成下图所示:

Sqlite3中replace语句用法详解

  (图 2)

  对比图1和图2 , 可以发现: 在图1中, id为2 的记录是表中的第一条记录, 当执行完上述的replace语句之后, id为2的记录位于整张表的最后。 这就说明, 这条replace语句删除了原有的id为2的记录, 有插入了一条新的id为2的记录。

  2 一般用replace语句替换一条记录的所有列, 如果在replace语句中没有指定某列, 在replace之后这列的值被置空 。

  下面我们还是以id为2 的记录做实验, 执行如下语句:

?

1

2

sqlite> replace into student (id, name, sex, email, fenshu, tecid) values ('2',

'lisi', '*F', '123456@qq.com', '80', '2');

  该语句还是替换id为2, name为lisi的记录, 只是在指定列的时候, 没有指定class列。 在执行完成之后, 表中的数据如下:

Sqlite3中replace语句用法详解

  (图 3)

问小白
问小白

免费使用DeepSeek满血版

下载

  对比图2和图3 , 可以看到, id为2, name为lisi的记录的class字段没有值。

  3 replace根据主键确定被替换的是哪一条记录

  在该表中, 把id和name指定为复合主键。 在上面两条语句执行的时候, 都在values中指定了id为2, name为lisi 。 执行之后看到的结果也是id为2, name为lisi的记录被替换。 这就说明了replace语句根据主键的值确定被替换的是哪一条记录。

  4 replace语句不能根据where子句来定位要被替换的记录

  执行以下语句:

?

1

2

sqlite> replace into student (id, name, sex, email, fenshu, tecid) values ('2',

'lisi', '*F', '123456@qq.com', '80', '2') where id = '2';

  会报如下错误:

?

1

Error: near "where": syntax error

  5 如果执行replace语句时, 不存在要替换的记录, 那么就会插入一条新的记录。

  在student表中, 我们让id和name成为复合主键。 下面我们使用replace语句替换id为100, name为a 的记录。 从图3中可以看到, 表中存在name为a的记录, 但是这条记录的id为7, 而不是100 。也就是说 id为100, name为a 的记录不存在。

  执行如下语句:

?

1

2

sqlite> replace into student (id, name, sex, email, fenshu, tecid, class) values

 ('100', 'a', '*F', '123456@qq.com', '80', '2', '1');

  执行完成之后, 表中的数据如下:

Sqlite3中replace语句用法详解

  (图 4)

  可以看到, 在表中插入了一条新的记录。

  6 如果新插入的或替换的记录中, 有字段和表中的其他记录冲突, 那么会删除那条其他记录。

  上面的第5步同时也说明了这个问题。 对比图4 和图5 , 发现在插入一条新的id为100, name为a的记录之后, 还删除了id为2, name为lisi的记录。 为什么会这样呢? 我们在开始的时候说过, 表中的email字段加上了唯一约束。 id为2的记录的email和新插入的id为100的记录中的email相同, 都是123456@qq.com 。 这就导致违反唯一约束, 所以在插入id为100的记录之前, 删除了id为2的记录。

  下面再次验证一下。 现在我们替换id为5, name为lisi3 的记录, 将它的email替换为2@163.com 。 表中的id为5的记录的email字段也是2@163.com , 所以会导致违反唯一约束。

  执行下面的语句:

?

1

2

sqlite> replace into student (id, name, sex, email, fenshu, tecid, class) values

 ('5', 'lisi3', 'F', '2@163.com', '80', '2', '1');

  执行完这条语句之后, 表中的数据如下图:

Sqlite3中replace语句用法详解

  (图 5)

  对比图4 和 图5 , 发现id为5的记录被替换掉, 并且把这条记录的email设置为2@163.com, 这和图4中原有的id为6的记录冲突, 所以导致id为6的记录被删除, 在图5 中已经没有id为6的那条记录了。

  replace语句和update语句的对比

  对于update语句, 因为经常使用到,应该算比较熟悉。 下面对比一下update和replace语句的行为, 只是简单陈述, 不再以具体实例说明。

  update语句使用where子句定位被更新的记录;

  update语句可以一次更新一条记录, 也可以更新多条记录, 只要这多条记录都复合where子句的要求;

  update只会在原记录上更新字段的值, 不会删除原有记录, 然后再插入新纪录;

  如果在update语句中没有指定一些字段, 那么这些字段维持原有的值, 而不会被置空;

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

36

2026.02.03

短剧入口地址汇总
短剧入口地址汇总

本专题整合了短剧app推荐平台,阅读专题下面的文章了解更多详细入口。

102

2026.02.03

植物大战僵尸版本入口地址汇总
植物大战僵尸版本入口地址汇总

本专题整合了植物大战僵尸版本入口地址汇总,前往文章中寻找想要的答案。

49

2026.02.03

c语言中/相关合集
c语言中/相关合集

本专题整合了c语言中/的用法、含义解释。阅读专题下面的文章了解更多详细内容。

9

2026.02.03

漫蛙漫画网页版入口与正版在线阅读 漫蛙MANWA官网访问专题
漫蛙漫画网页版入口与正版在线阅读 漫蛙MANWA官网访问专题

本专题围绕漫蛙漫画(Manwa / Manwa2)官网网页版入口进行整理,涵盖漫蛙漫画官方主页访问方式、网页版在线阅读入口、台版正版漫画浏览说明及基础使用指引,帮助用户快速进入漫蛙漫画官网,稳定在线阅读正版漫画内容,避免误入非官方页面。

76

2026.02.03

Yandex官网入口与俄罗斯搜索引擎访问指南 Yandex中文登录与网页版入口
Yandex官网入口与俄罗斯搜索引擎访问指南 Yandex中文登录与网页版入口

本专题汇总了俄罗斯知名搜索引擎 Yandex 的官网入口、免登录访问地址、中文登录方法与网页版使用指南,帮助用户稳定访问 Yandex 官网,并提供一站式入口汇总。无论是登录入口还是在线搜索,用户都能快速获取最新稳定的访问链接与使用指南。

417

2026.02.03

Java 设计模式与重构实践
Java 设计模式与重构实践

本专题专注讲解 Java 中常用的设计模式,包括单例模式、工厂模式、观察者模式、策略模式等,并结合代码重构实践,帮助学习者掌握 如何运用设计模式优化代码结构,提高代码的可读性、可维护性和扩展性。通过具体示例,展示设计模式如何解决实际开发中的复杂问题。

4

2026.02.03

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

5

2026.02.03

Python 强化学习与深度Q网络(DQN)
Python 强化学习与深度Q网络(DQN)

本专题深入讲解 Python 在强化学习(Reinforcement Learning)中的应用,重点介绍 深度Q网络(DQN) 及其实现方法,涵盖 Q-learning 算法、深度学习与神经网络的结合、环境模拟与奖励机制设计、探索与利用的平衡等。通过构建一个简单的游戏AI,帮助学习者掌握 如何使用 Python 训练智能体在动态环境中作出决策。

4

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Rust 教程
Rust 教程

共28课时 | 5.4万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 3.2万人学习

Go 教程
Go 教程

共32课时 | 4.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号