开发人员必须了解的一个SQL技巧

对于数据过滤而言CHECK约束已经算是相当不错了。然而它仍存在一些缺陷,比如说它们是应用到表上面的,但有的时候你可能希望指定一条约束,而它只在特定条件下才生效。

使用SQL标准的WITH CHECK OPTION子句就能完成这点,至少Oracle和SQL Server都实现了这个功能。下面是实现方式:




CREATE TABLE books (
id NUMBER(10) NOT NULL,
title VARCHAR2(100 CHAR) NOT NULL,
price NUMBER(10, 2) NOT NULL,

CONSTRAINT pk_book PRIMARY KEY (id)
);
/

CREATE VIEW expensive_books
AS
SELECT id, title, price
FROM books
WHERE price > 100
WITH CHECK OPTION;
/

INSERT INTO books
VALUES (1, '1984', 35.90);

INSERT INTO books
VALUES (
2,
'The Answer to Life, the Universe, and Everything',
999.90
);




正如你看到的那样,expensive_books 是那些价格大于100块的书。这个视图只会返回第二本书:




SELECT * FROM expensive_books;




上述查询的输出是:




ID TITLE PRICE
[*]- ----------------------------------------- -------
2 The Answer to Life, the Universe, and ... 999.9




不过由于我们使用了CHECK OPTION,我们还能防止用户往"昂贵的书籍"中插入那些廉价的。比如说,我们运行下这个查询:




INSERT INTO expensive_books
VALUES (3, '10 Reasons why jOOQ is Awesome', 9.99);



它是无法生效的。你会看到:

ORA-01402: view WITH CHECK OPTION where-clause violation


我们也无法将贵的书更新成便宜的:




UPDATE expensive_books
SET price = 9.99;




这个查询也会报出同样的ORA-01402错误。

[b]WITH CHECK OPTION内联[/b]

如果你需要局部防止脏数据被插入到表中,你可以使用WITH CHECK OPTION的内联子句:




INSERT INTO (
SELECT *
FROM expensive_books
WHERE price > 1000
WITH CHECK OPTION
) really_expensive_books
VALUES (3, 'Modern Enterprise Software', 999.99);



上述查询同样也会导到ORA-01402错误。

[b]使用SQL转换来生成特殊约束[/b]

CHECK OPTION对于已存储的视图非常有用,它使得那些无权直接访问底层表的用户能够获得正确的授权,而内联的CHECK OPTION主要是在应用的SQL中间转换层来进行动态SQL的转换。


这个可以通过[url=http://www.jooq.org/doc/latest/manual/sql-building/queryparts/custom-sql-transformation/]jOOQ的SQL转换功能[/url]来完成,比如说,你可以在SQL语句中对某个表进行约束,从根本上阻止了非法DML的执行。如果你的数据库没有本地提供行级别的安全性的话,这也是一个实现多租户的不错的方式。


更多文章请移步我的个人博客:[url=http://it.deepinmind.com]Java译站[/url]

原创文章转载请注明出处:[url=http://it.deepinmind.com/sql/2014/09/28/awesome-sql-trick-constraints-on-views.html]http://it.deepinmind.com[/url]


[url=jaxenter.com/one-magic-sql-trick-every-developer-should-know-51235.html]英文原文链接[/url]
SQL性能优化的21个小技巧 真正的一文在手,优化我有! 阅读详情

相关推荐

海康视觉平台VisionMaster实战入门:从通讯配置到工具应用

本文为海康VisionMaster视觉平台实战入门指南,详细介绍了从软件安装准备、与PLC等外部设备的通讯配置,到匹配定位、测量、畸变矫正等核心工具的应用方法。通过实战案例拆解,帮助工程师快速掌握如何搭建完整的机器视觉检测与引导定位系统,实现工业自动化项目落地。

weixin_29224309的博客 1007

Linux动态库加载失败/设置运行时搜索路径/linux中查看动态库的查找搜寻路径

程序运行时有以下错误 ./dom1: error while loading shared libraries: libmemcached.so.11: cannot open shared object file: No such file or directory 动态库加载失败 1、首先应该使用命令查看所加载的库 ldd ./dom1 linux-vdso.so.1 =...

勿忘初心,方得始终 3025

EPLAN中3D宏文件的创建与优化技巧(以开关电源为例)

本文以开关电源为例,详细讲解了在EPLAN中创建和优化3D宏文件(.ema)的全流程。从搭建宏项目、导入模型,到精确定义安装面、调整视野方向,再到定义3D连接点并关联部件库,旨在帮助电气工程师在设计阶段实现精准布局、避免安装冲突,从而提升设计效率与质量。

weixin_29219539的博客 547

每个开发人员都需要了解的一个SQL技巧

对于数据过滤而言CHECK约束已经算是相当不错了。然而它仍存在一些缺陷,比如说它们是应用到表上面的,但有的时候你可能希望指定一条约束,而它只在特定条件下才生效。 使用SQL标准的WITH CHECK OPTION子句就能完成这点,至少Oracle和SQL Server都实现了这个功能。

Websites 1433

【论文复现】自动化细胞核分割与特征分析

HoVer-Net是一种精心设计的多分支深度学习网络架构,专为处理复杂的多组织显微图像中的细胞核实例分割与精确分类任务而开发。该网络通过创新的策略,不仅有效解决了细胞核在密集聚集区域难以准确区分的问题,还实现了对每个独立细胞核类型的细致分类。此外,HoVer-Net还引入了专门的上采样分支,这一设计旨在对每个成功分割出的细胞核实例进行进一步的核类型分类。这一分支利用高级语义信息,结合精心设计的分类策略,能够准确判断每个细胞核的所属类型,为医学研究提供了宝贵的细胞水平信息。

2201_75366661的博客 1978

安卓设备安全相关技术

当前安卓设备使用的加密方案是基于Soc中一块可写入的rom实现,称为熔丝,其结果不可逆。 1、secureboot 2、AVB(Android Verify Boot) 3、dm-verity(device mapper) 4、keymaster 5、crypto 6、rpmb(replay private memory block) 7、TEE(Trust execute environment) 8、SELinux .........

weixin_43797328的博客 4838

构建软件项目“军需保障体系”:从DevContainer到自动化脚本的工程实践

在软件工程领域,环境配置、依赖管理和自动化脚本等基础设施工作,常被称为项目的“后勤保障”或“军需体系”。其核心原理是通过标准化、代码化和自动化的手段,解决开发环境不一致、依赖冲突和手动操作易错等工程痛点。这套体系的技术价值在于显著提升团队协作效率、保障交付质量并降低运维风险。典型的应用场景包括新成员快速上手项目、多环境部署以及团队知识沉淀。本文以DevContainer和Makefile等具体工具为例,深入探讨如何系统化构建一个高效、可靠的软件项目“军需保障体系”,实现从环境供给、工具链统一到知识沉淀的全流

weixin_33898876的博客 305

华为OD面试手撕真题目录

2026最新华为OD面试手撕真题 , 提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解.

qq_45776114的博客 1万+

Oracle查询一个表中有多少个字段

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33979363的博客 1773

【推荐100个unity插件】unity实现交互式火焰 —— Ignis

Ignis是一款Unity互动式消防系统插件,可轻松将物体转换为可燃物。支持固体、植被、蒙皮网格和地形树木等多种对象类型,提供火焰蔓延、熄灭等效果。安装需通过Unity Package Manager添加Visual Effects Graph,并按照指引转换目标物体材质。使用盒型碰撞体或网格计算燃烧区域,可自定义火焰参数和视觉效果。内置多种转换选项,如Flammable Vegetation、Flammable Skinned Mesh等,适用于不同场景需求。注意使用前需备份材质和地形数据,并提供性能优化

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2236

《基于FPGA的数字信号处理》专栏的导航与说明

《基于FPGA的数字信号处理》专栏的导航与说明

孤独的单刀 4160

关于学习数据库开发的一点建议和忠告

Normal 0 7.8 磅 0 2 false false false ...

csy542339419的博客 96

SPRD Android 14 通过属性控制系统设置显示双栏或者单栏

SPRD Android 14 通过属性控制系统设置显示双栏或者单栏

m0_60898338的博客 1118

SQL注入WAF绕过

SQL注入WAF绕过 (1)大小写绕过 此类绕过不经常使用,但是用的时候也不能忘了它,他原理是基于SQL语句不分大小写的,但过滤只过滤其中一种。 (2)替换关键字 这种情况下大小写转化无法绕过而且正则表达式会替换或删除select、union这些关键字如果只匹配一次就很容易绕过 http://www.xx.com/index.php?page_id=-15 UNIunionON SELselec...

tomyyyyy 176

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

mysql连续相邻一样的合并_SQL中数据行相邻且某一列的值相同则合并

不好意思没看清需求,以下是Oracle代码withtas(select'a'asa,1asbfromdualunionallselect'a',2fromdualunionallselect'a',3fromdualunionallselect'b',1fromdualunionallselect'b',4fromdualunional...

weixin_36315722的博客 959

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

开发人员应该了解哪些 SQL 知识?

无论您是 SQL 新手还是已经使用它多年,它仍然是未来的一项关键语言技能。通过将上述经验教训付诸实践,您应该能够提高应用程序性能并利用 SQL 提供的功能。

ActionTech的博客 1256

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

sql调优指南及高级sql技巧

SQL调优指南及高级SQL技巧是数据库管理和开发人员在日常工作中不可或缺的一部分。

破损的天堂鸟博客 816

适用于SQL开发人员的7个便捷的SQL脚本

我们所做的许多事情都取决于我们拥有的知识。 如果我们知道可以做什么,那么只有这样我们才能做出更明智,更有效的决策。 这就是为什么口袋里准备好快速提示和技巧总是很好的原因。 该原则适用于所有地方,包括MS-SQL开发人员。 在本文中,我想分享一些SQL脚本,这些脚本对我作为SQL开发人员的日常工作非常有用。 我将提供一个简短的场景,说明在哪里可以将这些脚本与下面的脚本一起使用。 注意:...

代码教主 835

机器学习火热,SQL 开发人员有何用?

作者 | Samridhi译者 | Arvin,责编 | 伍杏玲头图 | 视觉中国出品 | 优快云(ID:优快云news)以下为译文:你是否知道到2024年,全球机器学习市场预计将达...

优快云资讯 3850

MyBatis是一个Java的持久层框架,它要求开发人员手动编写SQL语句

MyBatis是一个Java的持久层框架,它要求开发人员手动编写SQL语句。通过手动编写SQL,开发人员能够更精确地控制数据库操作。他们可以根据具体的业务需求和数据库设计,创建高度定制的查询语句,这是使用全自动ORM(对象关系映射)工具通常无法实现的。

[Blog][Domain] programb.blog.youkuaiyun.com 1072

高级SQL技巧

索引优化索引是提高数据库查询性能的重要手段。通过创建合适的索引,可以加快数据的检索速度,减少查询的时间复杂度。常见的索引类型包括B树索引、哈希索引、全文索引等。根据不同的查询需求选择合适的索引类型,可以显著提高查询效率。查询优化查询优化是提高SQL查询性能的关键。通过重写查询语句、使用子查询、连接表等方式,可以减少查询的计算量,提高查询效率。常见的查询优化技术包括避免全表扫描、合理使用索引、减少不必要的计算等。通过这些技术,可以显著提高查询的性能。存储过程与函数。

小透明的博客 1414

文本转 SQL:开发人员从零到精通的指南

大家好,这里是!点击上方关注,添加“”,一起学习大厂前沿架构!,将自然语言转换为数据库查询。本指南涵盖从基于规则到机器学习模型的实现方法、实用代码示例以及可用于生产的安全性和性能最佳实践。

Dc253061007的博客 1006

SQL调优指南及高级SQL技巧

SQL语句性能调优是数据库应用开发过程中的一项重要工作。通过合理使用索引、优化表结构、优化查询语句、合理使用缓存机制以及定期检查和优化数据库等方法,可以提高数据库查询的效率和系统的整体性能。在实际开发中,开发人员应根据具体需求和情况,选择合适的优化方法和技巧,提升SQL查询的性能和响应速度。通过索引优化,可以减少数据查询时的扫描量;通过SQL语句优化,可以减少查询字段和子查询,合理使用连接语句;通过数据库服务器参数优化和数据库结构优化,可以进一步提升查询性能。

Chujun123528的博客 1103
上一篇: Bash漏洞那些事儿
下一篇: 空指针的救星
spidercoco
博客等级 码龄18年 47粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值