不同数据库SQL日期转换为yyyy-mm-dd格式的方法
一篇随手记,整理MySQL、SQL Server、Oracle、PostgreSQL里把日期转成yyyy-mm-dd的几种写法,省得每次都要翻文档。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-06-04 18:15:39 SQLite 外键约束 级联删除 数据库
在 SQLite 里如果建了外键,删主表记录时很容易碰到「FOREIGN KEY constraint failed」这种报错,原因就是子表里还有数据引用着你要删的那行。处理这个问题有几种思路,下面一个个说。
最直接的办法就是手动把子表关联数据清掉,再动手删主表。
比如 order_items 表里 order_id 指向 orders 表的 id,要先执行 delete from order_items where order_id = 2,确认清干净了,再 delete from orders where id = 2。这种做法不会有什么副作用,就是麻烦,每次都得写两条 delete,而且容易忘,业务代码里一忘就出线上问题。
更省事的做法是用外键的级联删除,建表的时候加上 ON DELETE CASCADE。这样只要删主表记录,子表里对应的行就自动没了。不过 SQLite 有个坑:外键约束默认是关闭的,不管你建表时写没写 foreign key,都要先执行 pragma foreign_keys = ON 把它打开,否则外键定义形同虚设。这点很多人一开始都会忽略,我早期也在这上面浪费过时间。建表语句大概长这样:
create table order_items ( id integer primary key, order_id integer, product_name text, foreign key (order_id) references orders(id) on delete cascade );
如果表已经建好了,想后加级联删除,SQLite 的 alter table 能力很有限,不支持直接修改外键约束。只能走重建表的路子:新建一张符合要求的表,把数据倒过去,再删掉旧表重命名。
步骤大致是 create table new_order_items ( ... foreign key ... on delete cascade ),然后把旧表数据 insert into new_order_items select * from order_items,接着 drop table order_items,最后 alter table new_order_items rename to order_items。整个过程最好在维护窗口或者低峰期操作,不然容易锁表。
还有一种不推荐的方式,就是临时关掉外键约束,删完再打开:先 pragma foreign_keys = OFF,执行 delete from orders where id = 2,再 pragma foreign_keys = ON。这么做虽然能强制删掉,但很容易破坏数据一致性,子表残留的引用会变成悬空指针,查出来一堆没法关联的脏数据。除非你百分百确定后续会手动补删或者补关联,否则别轻易用。
再说一下级联删除的影响。on delete cascade 会在删主表时把子表关联数据一波带走,而且是静默的。
如果你子表里有些数据本来想留着,只是因为业务逻辑变更才删主表,那这些数据就一起陪葬了,找都找不回来。所以在设计外键的时候最好想清楚,这个地方到底该用 cascade、set null 还是 restrict。
最后给一个完整跑通的例子,方便验证:
-- 开外键 pragma foreign_keys = ON;
create table orders ( id integer primary key, customer_name text );
create table order_items ( id integer primary key, order_id integer, product text, foreign key (order_id) references orders(id) on delete cascade );
insert into orders values (1, 'Alice'), (2, 'Bob'); insert into order_items values (1, 1, 'Apple'), (2, 2, 'Banana');
-- 删主表 id=1,子表里 order_id=1 的行自动消失 delete from orders where id = 1;
select * from order_items; -- 只剩 order_id=2 那条
整个过程下来,最核心要记住的就两点:一是外键约束要手动打开,二是如果想少写 delete,建表时就把 on delete cascade 加上。真到了要改已有表的时候,按重建表的思路来,别在线上直接玩 pragma foreign_keys = OFF 这种操作。
一篇随手记,整理MySQL、SQL Server、Oracle、PostgreSQL里把日期转成yyyy-mm-dd的几种写法,省得每次都要翻文档。
本文将深入探讨MySQL中DATETIME类型的全方位操作。从精确到秒级的时间存储机制,到字段规范定义、高效数据插入方法,再到灵活的格式化输出技巧,我们为您提供一套完整的实践方案。同时,详细解析开发中常见的时间偏移、时分秒丢失等问题及其规避策略,助您构建健壮的时间数据处理系统。
文章深入剖析SQLite外键约束导致删除操作受阻的常见问题,并提供多维度解决方案。从手动清理子表记录,到巧妙运用级联删除功能自动化处理,本文将逐一讲解。同时,警示临时禁用约束的潜在风险,确保数据完整性。告别删除难题,轻松管理数据库!
连接本地项目到远程数据库(如百度云数据库)涉及一系列步骤,以下是一个详细的指南,帮助你完成这个过程。1.准备阶段1.1创建远程数据库在百度云数据库控制台中创建一个新的数据库实例,选择你需要的数据库类型(如MySQL、PostgreSQL等),并设置相应的配置(如内存、存储空间、网络类型等)。1.2获取数据库连接信息在创建完成后,你会获得数据库的连接信息,包括
网站的维护是网站成功的重要因素之一。一个好的网站需要定期或不定期地更新内容,才能不断地吸引更多的浏览者,增加访问量。网站维护是为了让您的网站能够长期稳定地运行在互联网上。那么我们应该做些什么来维护网站呢?(1)数据库维护有效地保存数据库是网站维护的重要内容,因此数据库的维护要受到重视;数据库知识了解,及时备份网站数据库数据和网站源码数据,以防止遭黑客入侵造成