SQL学习二十、SQL高级特性

news/2024/4/29 17:27:18/文章来源:https://blog.csdn.net/m0_37168878/article/details/127612402

约束(constraint)

管理如何插入或处理数据库数据的规则。

DBMS 通过在数据库表上施加约束来实施引用完整性。
大多数约束是在 表定义中定义的,用 CREATE TABLE 或 ALTER TABLE 语句。


1、主键 (PRIMARY KEY)

主键是一种特殊的约束,用来保证一列(或 一组列)中的值是唯一的,而且永不改动。主键可以唯一标识表中的一行。且主键值不能重用。如果从表中删除某一行,其主键值不分配给新行。
这方便了直接或交互地处理表中的行。没有主键,要安全地 UPDATE 或 DELETE 特定行而不影响其他行会 非常困难。

  • 创建表的时候指定主键
CREATE TABLE `supplier_new` (`id`	INTEGER NOT NULL,`supplier`	TEXT,`supplierAddress`	TEXT,`supplierTel`	TEXT NOT NULL,`supplierEmail`	TEXT,`supplierContact`	TEXT,PRIMARY KEY(`id`)
);
  • 指定自增主键
CREATE TABLE `adjunctlist` (`id`	integer PRIMARY KEY AUTOINCREMENT,`add_time`	text,`ext0`	text,`ext1`	text,`file_name`	text,`file_no`	integer,`file_path`	text,`file_uri`	text,`flaw_id`	integer,`is_upload`	integer,`local_flaw_id`	integer,`user_id`	text,`task_id`	integer,`task_point_id`	integer,`task_type`	integer
);
  • 某些DBMS运行在ALTER TABLE语句中指定主键
ALTER TABLE 表名  ADD CONSTRAINT PRIMARY KEY (列名);

比如这张表在创建的时候没有指定主键,我们可以通过ALTER TABLE语句为其指定主键

alter table test
add constraint primary key (test.no)

**注意:**SQLite不允许使用ALTER TABLE定义键,要求在初始的CREATE TABLE 语句中定义它们。


2、外键

外键是表中的一列,其值必须是另一表的唯一约束列,一般用另外一张表的主键。

当我们指定外键后,DBMS 不允许删除在另一个表中具有关联行的行,因此,可以利用外键防止意外删除。

比如,我们我们的订单表( oderlist_new )和供应商表( supplier_new )

  • 创建时指定
    同样的我们在创建表的时候可以指定表的外键,使用REFERENCES 表名(列名)
    例如,我们在创建订单表(oderlist_new)时指定订单表(oderlist_new)的supplierId作为外键关联供应商表(supplier_new)的主键id
CREATE TABLE `oderlist_new` (`id`	INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,`goodsName`	TEXT,`quantity`	integer,`item_price`	real,`orderNo`	text NOT NULL,`userId`	INTEGER,`userName`	TEXT,`orderTime`	TEXT,`supplierId`	INTEGER NOT NULL REFERENCES supplier_new (id)
);
  • 利用ALTER TABLE指定
    利用ALTER TABLE语句时需要这样写
ALTER TABLE 表1
ADD CONSTRAINT FOREIGN KEY (表1.列) REFERENCES 表2(表2.列) 
  • 防止意外删除
    比如我们删除一条供应商信息,这条供应商信息在订单表中有作为外键使用,删除的时候就会失败。
delete from supplier_new
where id = 1


3、唯一约束

唯一约束用来保证一列(或一组列)中的数据是唯一的。它们类似于主 键,但存在以下重要区别。
1、表可包含多个唯一约束,但每个表只允许一个主键。
2、唯一约束列可包含 NULL 值。
3、唯一约束列可修改或更新。
4、唯一约束列的值可重复使用。
5、与主键不一样,唯一约束不能用来定义外键。

例如我们的订单表,id是主键(唯一约束),订单编号orderNo也是唯一约束

唯一约束既可以用 UNIQUE 关 键字在表定义中定义,也可以用单独的 CONSTRAINT 定义。

创建订单表的时候,指定orderNo具有唯一约束orderNo text NOT NULL UNIQUE

CREATE TABLE `oderlist_new` (`id`	INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,`goodsName`	TEXT,`quantity`	integer,`item_price`	real,`orderNo`	text NOT NULL UNIQUE,`userId`	INTEGER,`userName`	TEXT,`orderTime`	TEXT,`supplierId`	INTEGER NOT NULL,FOREIGN KEY(`supplierId`) REFERENCES `supplier_new`(`id`)
);

4、检查约束

检查约束用来保证一列(或一组列)中的数据满足一组指定的条件。

  • 常见用途

1、检查最小或最大值。例如,防止 0个物品的订单(即使0是合法的数)。
2、指定范围。例如,保证发货日期大于等于今天的日期,但不超过今天 起一年后的日期。
3、只允许特定的值。例如,在性别字段中只允许 M 或 F。

例如,我们限定订单表中商品单价和商品数量必须大于0,CHECK(quantity > 0)CHECK(item_price > 0)

CREATE TABLE `oderlist_new` (`id`	INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,`goodsName`	TEXT,`quantity`	integer CHECK(quantity > 0),`item_price`	real CHECK(item_price > 0),`orderNo`	text NOT NULL UNIQUE,`userId`	INTEGER,`userName`	INTEGER,`orderTime`	TEXT,`supplierId`	INTEGER NOT NULL,FOREIGN KEY(`supplierId`) REFERENCES `supplier_new`(`id`)
);

这样我们在插入不符合要求的数据时就会失败,比如我们插入如下数据

"菠萝"	
"0"	
"0.0"	
"20181023008"	
"30"	
"王舍"	
"2018-10-23 23:12:49"	
3
  • 插入不符合约束的数据
insert into oderlist_new (goodsName,quantity,item_price,orderNo,userId,userName,orderTime,supplierId)
VALUES ('菠萝',0,0.0,'20181023008',30,'王舍','2018-10-23 23:12:49',3)

执行结果

  • 插入符合约束的数据,我们把单价修改为20.0,数量修改为10
insert into oderlist_new (goodsName,quantity,item_price,orderNo,userId,userName,orderTime,supplierId)
VALUES ('菠萝',10,20.0,'20181023008',30,'王舍','2018-10-23 23:12:49',3)

执行结果

插入成功


索引

索引用来排序数据以加快搜索和排序操作的速度。

注意
1、索引改善检索操作的性能,但降低了数据插入、修改和删除的性能。 在执行这些操作时,DBMS必须动态地更新索引。
2、索引数据可能要占用大量的存储空间。

所以,在这些情况下不应该使用索引

  • 索引不应该使用在较小的表上。

  • 索引不应该使用在有频繁的大批量的更新或插入操作的表上。

  • 索引不应该使用在含有大量的 NULL 值的列上。

  • 索引不应该使用在频繁操作的列上。

  • 创建索引

索引用CREATE INDEX语句创建(不同DBMS创建索引的语句变化很大)。

CREATE INDEX 索引名
ON 
表名 (列名); 

例如,我们用订单编号作为订单表的索引

CREATE INDEX oderlist_new_ind
ON 
oderlist_new (orderNo); 

执行结果

创建成功


  • 查询数据库中所有索引
SELECT * 
FROM sqlite_master 
WHERE type = 'index';

查询结果

  • 查询对应表下的索引 使用 AND 子句连接表名
SELECT * 
FROM sqlite_master 
WHERE type = 'index' and tbl_name = 'oderlist_new';

  • 删除索引 DROP INDEX 索引名
DROP INDEX 'oderlist_new_ind';

执行成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_410077.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AMCL代码详解(六)amcl中的重采样

1.重采样判断 上一章讲述了amcl中如何根据激光观测更新粒子权重,当粒子更新完后amcl会需要根据程序判断是否需要进行重采样。这个判断在粒子观测更新权重后进行判断,代码在amcl_node.cpp中: if(!(resample_count_ % resample_interval_)){ p…

[GYCTF2020]Easyphp

尝试了一下万能密码不行,又到处翻了一下,扫目录结果又有www.zip 审计代码好久,序列化和sql结合的题还是第一次见,太菜了呀,花了很久时间才理解这个题 首先看到update.php,这个文件是最亮眼的,…

javascript 原生类 DOMParser 把 字符串格式的HTML文档源码 转换成 document DOM对象

文章目录IntroQADOMParser 在 console 的使用cheerio 在 node 项目中的使用Reference测试sumIntro 有一天我在写爬虫。 其实也说不上是爬虫,就是打开浏览器上网,觉得页面有些数据挺有意思,就打开开发者工具,在 Network/Console 中…

01.初识C语言1

一、前期准备 1.gitee网址(代码托管网站):工作台 - Gitee.com Git教程 - 廖雪峰的官方网站 (liaoxuefeng.com) 用法: 1)新建仓库 2)随意勾选 3)网络仓库构建完成 2.所学知识:计算…

【期末大作业】基于HTML+CSS+JavaScript网上订餐系统(23个页面)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

Jetson Orin 平台单进程采集四路独立video调试记录

1. 概述 现在有4个摄像头, 如何捕获4个摄像头(/dev/video0 - video3)在一个进程像这样: 现在只能捕捉一个相机使用gst-launch如下: gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,width=1280,height=720 ! videoconvert ! video/x-raw,format=I420 ! xvimagesi…

《设计模式:可复用面向对象软件的基础》——行为模式(2)(笔记)

文章目录五、行为模式5.5 MEDIATOR(中介者)1.意图补充部分2.动机3.适用性4.结构5.参与者6.协作7.效果8.实现9.代码示例10.相关模式5.6 MEMENTO ( 备忘录)1.意图2.别名3.动机4.适用性5.结构6.参与者7.协作8.效果9.实现10.代码示例11.相关模式5.7 OBSERVER (观察者)1.意图2.别名3…

21.C++11

C11的官网:C11 - cppreference.com 1.C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1),使得C03这个名字已经取代了C98称为C11之前的最新C标准名称。不过由于TC1主要是对C98标准中的漏洞进行修复,语言的核心部分则没有改动&am…

Java语言实现猜数字小游戏

之前笔者在学习C语言的初级阶段,就已经实现了用C语言简单实现猜数字小游戏,既然笔者最近在学习Java的初级阶段,那么,也应该写一个Java语言实现的猜数字小游戏!! C语言实现猜数字小游戏:原文链接…

浏览器播放rtsp视频流:4、jsmpeg+go实现局域网下的rtsp视频流web端播放

文章目录1.前言2.资料准备3.兼容性及适用性说明4.jsmpeg架构5.基于以上架构的go方案可行性分析6.编译和结果展示(编译坑点)7.最后1.前言 之前的rtsp转webrtc的方案存在如下缺陷:1.只支持h264;2.受限于webrtc的理解难度以及搭建tu…

Hproxy项目前端

hproxy项目前端使用vue-element-admin框架,页面为hook列表,和一个添加hook页面。 添加路由 编辑src/router/index.js文件,在constantRoutes列表追加如下路由内容 {path: /hproxy,component: Layout,redirect: /hproxy/index,hidden: false,c…

各省市软考准考证打印时间,一起来看!

距离软考还有一周,各个省市的准考证也开始打印了! 各地防疫政策一定要遵守,不然错过,又等一年! 周末也有一些省市因疫情推迟、取消考试的。 一起来看! 考完之后,会在这里讨论一些答案&#x…

UWB室内定位系统铸造智能化企业安全管理系统

进入工业4.0时代以来,数字技术不断成熟、扩散和融合,加速推动工业企业数字化、智能化转型。企业推进数字化转型要整体规划、分布实施,需要考虑企业经营管理活动的全过程、全范围、全层级。各大行业已经开始配备UWB人员定位系统,提…

电脑C盘怎么清理到最干净

如果你的电脑C盘运行内存已经快满了,这个时候你怎么处理?让我们来看看如何清理C盘。 c如何清理盘: 方法一:存储状态 点击电脑win键,在设备左侧弹出提示框,进入系统配置,然后点击系统软件选项…

MyBatis Plus实现动态字段排序

利用周末时间,对已有的项目进行了升级,原来使用的是tkmybatis,改为mybatis plus。但是由于修改了返回数据的格式,前端页面字段排序失效了,需要刷新表格才会排序。页面效果如下 easyui的数据表格datagrid支持多字段排序…

商用车进入回暖周期,哪些供应商在领跑「主动安全」前装赛道

由于受到经济周期性影响,去年开始商用车市场出现一波下行行情。 中国汽车工业协会发布数据显示,2022年1-9月,商用车产销分别完成242.6万辆和248.4万辆,同比下降32.6%和34.2%,降幅较1-8月收窄1.5个百分点和2个百分点&a…

ZAB协议

1、定义 ZAB 协议全称:Zookeeper Atomic Broadcast(Zookeeper 原子广播协议)。 ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持 崩溃恢复 和 原子广播 协议,基于该协议,Zookeeper 实现了一种 主备模式 的…

什么是行内元素的盒模型

目录 行内元素的盒模型 display 可选值: visibility 可选值: 行内元素的盒模型 行内元素不支持设置宽度和高度 但是这并不是说明行内元素没有内容区 而是通过width和height不能改变内容区的大小 行内元素的内容区是由他里面的内容决定的&#xff0…

【视觉基础篇】14 # 如何使用片元着色器进行几何造型?

说明 【跟月影学可视化】学习笔记。 如何用片元着色器控制局部颜色? 把图片绘制为纯黑色: const fragment #ifdef GL_ESprecision highp float;#endifvarying vec2 vUv;void main() {gl_FragColor vec4(0, 0, 0, 1);} ;根据纹理坐标值来绘制&#…

工地ai智能视频监控系统

工地ai智能视频监控系统在监控摄像头监控的画面范围之内,对人的不安全行为(违规行为)或者物的不安全状态进行实时分析识别,当工地ai智能视频监控系统发现现场违规行为时,可根据需要设置各种警戒要求,工地ai…