ArcGIS arcpy代码工具——关于标识码的那些事(查找最大标识码、唯一性检查、重排序、空值赋值)

系列文章目录

ArcGIS arcpy代码工具——批量对MXD文件的页面布局设置修改
ArcGIS arcpy代码工具——数据驱动工具批量导出MXD文档并同步导出图片
ArcGIS arcpy代码工具——将要素属性表字段及要素截图插入word模板
ArcGIS arcpy代码工具——定制属性表字段输出表格
ArcGIS arcpy代码工具——批量栅格转点文件导出属性表


文章目录

  • 系列文章目录
  • 功能说明
  • 准备工作
  • 1 查找最大标识码
      • (1) 首先,判定字段是否存在
      • (2) 之后,判定图层是否为空
      • (3) 查找最大值
      • (4) 结果输出txt文档
      • (5) 运行效果
  • 2 标识码唯一性检查
      • (1) 首先,判定字段是否存在、图层是否为空
      • (2) 判定标识码值是否重复
      • (3) 结果输出txt文档
      • (4) 运行效果
  • 3 标识码重排序
      • (1) 首先,对数据库进行备份
      • (2) 判定字段是否存在
      • (3) 默认起始值
      • (4) 重排标识码
      • (5) 记录最大值
      • (6) 运行效果
  • 4 更新补全字段、空值赋值
      • (1) 判定字段是否存在
      • (2) 起始值(仅可以填写整数)
      • (3) 选择递增值,工具判定统一赋值操作还是补全字段操作
      • (4) 根据两种不同操作,输出不同结果语句
      • (5) 运行效果
  • 5 后记


功能说明

关于标识码的那些事(查找最大标识码、唯一性检查、重排序、空值赋值)。

首先,认识一下标识码,标识码通常是指用于唯一标识某个实体(如人、物、组织、事件等)的一串字符,它可以是数字、字母或者是数字与字母的组合。在不同的领域中,名称标识码有着不同的应用和含义。类如身份证号码,唯一标识人的特征码。

在数据库中,标识码是一种用于唯一标识数据库对象的代码或值。它通常被用作主键或索引的基础。标识码可以是数字、字符或二进制数据,具体取决于数据库管理系统的实现。标识码可以通过自动生成、手动输入或使用特定算法来创建。在使用标识码时,需要注意确保其唯一性以避免数据冲突。

一般在地理数据库中,给图层的字段命名为BSM、标识码,字段类型有数值型或者字符型,是标识和定位地理要素的索引,故一般要求具有唯一性,不能重复,不能空值,维护起来较为复杂。

本文章针对维护标识码工作的痛点,介绍一些维护工具目标为:

  • 1 查找数据库中最大标识码
  • 2 标识码唯一性检查
  • 3 重排序标识码
  • 4 标识码空值赋值、更新补全

准备工作

实验工具,随便找一个地理数据库,可以是mdb或gdb格式,包含数据集图层和数据集外图层,每个图层含有BSM字段,字段类型有数值型,有字符型,个别图层缺失BSM字段,个别图层要素为空,个别图层BSM字段为空值null或者空格,个别图层的BSM值是重复值。

下面是样式数据的结构图:
1

1 查找最大标识码

一个合格的地理数据库,每个图层的每个要素都应该有一个唯一的标识码,那么这个地理数据库也应该有一个最大标识码,获取到最大标识码,针对地理数据库后续增加的要素就可以准确和方便的进行标识码的赋值工作。

如何查找地理数据库中的最大标识码?

思路如下:
遍历地理数据库中的要素集和单独图层,再遍历每个图层的中的每个要素,将标识码的值放入列表 [ ] 中,然后对列表取最大值,得到最大标识码。

再复杂一点,可以建立字典 { },针对每个图层进行查询,图层名作为字典的键,该图层的最大标识码作为字典的键值。这样就获知了每个图层的最大标识码,最后再对字典的键值取最大值,得到地理数据库的最大标识码值。

(1) 首先,判定字段是否存在

查找字段BSM的最大值,首先要判定字段是否缺失,如果缺失BSM字段,则后续的查找最大值也就可以跳过了。

关键代码 :
首先获取图层字段的集合,再使用 if 语句进行判定BSM字段是否在集合内,判定缺失则输出警告语句。

field_names = [f.name for f in arcpy.ListFields(feature_class)]
if field_name not in field_names:arcpy.AddWarning(xxxxx)

(2) 之后,判定图层是否为空

图层有BSM的字段,如果没有要素,空图层,后续查找最大值也可以跳过了。

关键代码 :
如何判定是否是空图层?可以这样理解,该图层的最大标识码为空值,即 None。如果为空,输出警告语句。

max_id = max(long(row[0]) for row in cursor)
max_id = None
arcpy.AddWarning(xxxxx)

(3) 查找最大值

图层有BSM字段,要素不为空,则可以查找最大值了。

关键代码 :
地理数据库,有要素数据集,有直接位于工作空间内的要素,在遍历的时候,要素数据集内的图层比外面的图层要多一层目录(即数据集的名称),这是成功遍历地理数据库所有要素层的关键。

//遍历所有要素集内的要素,如样例数据 T2021、T2022、T2025.
for fds in arcpy.ListDatasets("*", "Feature"):for fc in arcpy.ListFeatureClasses("*", "", fds):......//遍历直接位于工作空间内的要素,如样例数据的 T2023、T2024.
for fc in arcpy.ListFeatureClasses("*", "", ""):......

(4) 结果输出txt文档

地理数据库的图层可能很多,如果都使用arcpy.AddWarning()、arcpy.AddMessage()语句直接在运行窗口显示结果,无法仔细查看详细记录,故最好把结果输出到一个txt结果文档中保存,方便随时查阅。

关键代码 :
可以创建一个输出 txt文档的 函数,将查询过程中产生的 结果语句,调用函数写入txt文档。

def log_to_file(message, outtxt):with open(outtxt, "a") as txtfile:txtfile.write(message.encode('utf-8') + "\n")def find_max_ids_in_workspace(a, b, output_file):......log_to_file(unicode(message, "utf-8"), output_file)

(5) 运行效果

我制作了arcgis工具箱工具 快速查找最大标识码BSM工具 ,有需要的可以去下载使用,下图是运行界面:

2

参数1:输入mdb和gdb地理数据库,支持中文目录;
参数2:指定查询的字段名称,可以是数值型字段和文本型字段,支持中文字段名;
参数3:输出结果txt,点击确定即可运行查找最大标识码。

我设置的地理数据库是某地类库,字段名称为BSM,运行结果如下图:
3
输出的 output.txt 保存的内容与运行窗口显示的一致,将运行结果完整的保存了下来。

2 标识码唯一性检查

标识码的作用就是标识和定位要素的唯一特征码,如果标识码重复了,那么地理数据库就是不合格的。所以,检查标识码的唯一性这项工作,就显得非常必要。

如何判定地理数据库中的标识码是否存在重复值?

思路如下:
遍历地理数据库中的要素集和单独图层,再遍历每个图层的中的每个要素,获取每个要素的标识码,在将 当前标识码 放入总列表 [ ] 前,判断该标识码值是否存在于 总列表 [ ] 中,如果在总列表中已经存在,则说明该标识码值存在重复,将该重复值存入单独的 重复值列表 [ ]。最后将重复的标识码结果输出txt文档进行记录。

再复杂一点,可以建立字典 { },标识码作为字典的键(因为重复的标识码可能存在于不同的图层中,而标识码值作为不同数字是唯一的),图层名字作为字典键值,当存入 重复值字典 { } 中,可以知道 重复的标识码 在 哪个图层中出现。

(1) 首先,判定字段是否存在、图层是否为空

首先要判定字段是否缺失,图层是否为空,满足条件后,开始后续的查找重复值。

(2) 判定标识码值是否重复

判定标识码是否重复,因为要挂上图层名称,处理起来要复杂一些。

首先建立总的标识码库 字典 all_values {},每个标识码值和图层名称组成字典键值对,存入总库;

再建立一个 比较过程的字典 temp_value {},因为要遍历每个图层中的每个要素,重复标识码可能存在于同一个图层内,也可能存在跨图层重复,过程字典 temp_value {} 就是存储单个图层的重复值情况;

每个图层的重复值 temp_value {} 再跟 总库 all_values {} 进行比较,找出跨图层的重复值情况,并记录图层名称,存入 最终的重复标识码库 duplicates {}

最后,使用 format 语句读取 重复标识码库 duplicates {} 输出重复标识记录,输出txt记录文档。

关键代码 :
情况1: 重复标识码存在于同一个图层内。

all_values = {} # 用于存储所有图层中该字段的所有值及其所在图层
temp_value = {} # 存储 同图层  重复值情况
......
for row in cursor:value = row[0]# 如果值已经在 all_values 中,说明重复if value in all_values:# 更新temp_value,记录重复的图层名if value not in temp_value:temp_value[value] = [all_values[value], feature_class]else:temp_value[value].append(feature_class)

情况2: 重复标识码存在于跨图层。

all_values = {} # 用于存储所有图层中该字段的所有值及其所在图层
duplicates = {}  # 存储最终发现的重复值及其所在图层列表
feature_class = 图层名称
......
for row in cursor:value = row[0]   if value in all_values:# 如果值已存在,则记录为重复duplicates.setdefault(value, set()).add(feature_class)                                duplicates[value].add(all_values[value])else:all_values[value] = feature_class

关键语句: duplicates.setdefault(value, set()).add(feature_class)

该函数首先通过 setdefault 方法,检查 value 是否存在于 duplicates字典 中,
如果存在,则直接返回对应的集合;
如果不存在,则在 duplicates字典 中创建一个以value为键的空集合,并将该集合返回。
接下来,通过调用集合的add方法,将feature_class图层名称添加到集合中。
这样可以确保同一个value所对应的集合中,不会出现重复的feature_class图层名称。
最后,该函数没有返回值,只是更新了 duplicates字典 中相应键值对应的集合。

(3) 结果输出txt文档

把结果输出到一个txt结果文档中保存,方便随时查阅。

(4) 运行效果

我制作了arcgis工具箱工具 标识码BSM唯一性检查工具,有需要的可以去下载使用,下图是运行界面:
4
参数1:输入mdb和gdb地理数据库,支持中文目录;
参数2:指定查询的字段名称,可以是数值型字段和文本型字段,支持中文字段名;
参数3:输出结果txt,点击确定即可运行查找最大标识码。

我设置的地理数据库是准备好的 test.mdb,其中存在重复的标识码,字段名称为BSM,运行结果如下图:
5
输出的 标识码唯一性检查结果.txt 保存的内容与运行窗口显示的一致,将运行结果完整的保存了下来。

3 标识码重排序

一个新建的地理数据库,在完成图形要素的编辑后,一般都是在最后一个步骤进行标识码重排序工作,即对地理数据库中的所有图层每个要素,安排一个唯一的不重复的标识码。一般要求同一个图层内要素的标识码是从小到大按增序排列的。

arcgis软件在保存地理要素的时候,要素图层有个默认字段 OBJECT ID字段,即常说的ID字段,通常由数据库系统自动分配,它的值是一个递增的整数序列,从1开始,每插入一条记录,其值就会自动加1,它是一种唯一标识符,用于标识数据库表中的每一行。这个字段可以作为空间数据表的主键,用于建立与其他表的关联。

arcgis软件默认会给每个要素一个不重复的 ID,但是如果删除了某个要素,则该要素的原始ID号在这个地理数据库中将消失不再重现,后续新建立的要素 ID会按照本图层最大ID续排。如果手工设置标识码,可以参考 这个ID字段值,但是难免发生中间断号的情况。

如何完成对整库标识码的重排序工作?

思路如下:
遍历地理数据库中的要素集,遍历要素集中的第1个图层,打开要素属性表,给每行属性表的BSM字段填写数值,从1开始往后增加,到该图层的最后一个要素结束,记录最后的标识码值,作为要素集第2个图层属性表中填写标识码的起始值。依此类推,遍历完要素集后,再遍历外部的图层,遍历完所有的图层后,完成标识码的完整重排序工作。

注意:思路中使用的方法是,调用要素属性表,按照要素属性表的顺序从上到下安排标识码,而属性表的顺序就是 ID字段 生成的顺序,所有本质上还是利用了 ID字段。

更高级的要素排序方法,还有按照地理要素的坐标值,进行从上到下,从左到右的方式进行排序,这种排序方式的好处是,临近的要素 顺序号较为接近或者连续,方便查找定位。

而我的文章中使用的方法,调用ID字段,虽然系统ID值也是按照要素产生的顺序先后生成的,但是不能保证周边的要素ID值是连续的。

(1) 首先,对数据库进行备份

涉及到对整库操作,对某个字段进行重新填写值,原有标识码值将被清除,为了数据安全,在标识码重排序前还是建立一个备份数据库为好。数据备份工作也是 一个成熟GISer的良好习惯。

备份库命名就以时间戳命名,因为地理数据库有文件地理数据库(.gdb)和个人地理数据库(.mdb)
两种格式,后缀名获取自 参数1数据库名称即可。

关键代码 :

def create_backup(workspace, backup_path):timestamp = datetime.now().strftime("%Y%m%d%H%M")  # 获取当前时间戳mdborgdb = os.path.splitext(workspace)[1]  # 更加可靠地获取数据库扩展名backup_name = "备份库_{}{}".format(timestamp, mdborgdb)  # 创建备份文件名backup_full_path = os.path.join(backup_path, backup_name)  # 构建完整备份路径arcpy.Copy_management(workspace, backup_full_path, data_type="Workspace")

(2) 判定字段是否存在

首先要判定字段是否缺失,字段缺失将跳过该图层。满足条件后,开始后续的查找重复值。

(3) 默认起始值

这里增加了一个参数:起始值,默认起始值为1,即从1开始续排。
如果有特殊要求,比如说为了区分数据库,第一个数据库要求标识码从1开始最大999,第二个数据库要求标识码从1000开始最大1999,这个起始值可以设定。

(4) 重排标识码

从设定的起始值start_value开始重排标识码,第一个图层结束后,会产生一个临时最大值,作为下一个图层的起始值,所以 start_value值是一直在变化的。

遍历并增加过程值,最好的方式是 枚举,使用start_value作为计数器的起始值。
关键代码 :

with arcpy.da.UpdateCursor(feature_layer, bsm_field_name) as cursor:for i, row in enumerate(cursor, start=start_value):row[0] = icursor.updateRow(row)......i += 1......

(5) 记录最大值

在重排序函数的外面,建立一个全局参数 max_id = [],将过程最大标识码加入 列表中。最后对列表求取最大值,使用输出语句进行汇报:重排序后最大值为xxx。

关键代码 :

 global max_id = []  # 初始化列表用于存储每个要素类的最大值......max_id.append(i)  # 假设i是当前要素类的最大排序值......
max_value = max(max_id)
arcpy.AddMessage("重排序完成,最大值为 {} .".format(max_value))

(6) 运行效果

我制作了arcgis工具箱工具 数据库标识码BSM重排序工具、重构标识码工具,有需要的可以去下载使用,下图是运行界面:

6
参数1:输入mdb和gdb地理数据库,支持中文目录;
参数2:指定查询的字段名称,可以是数值型字段和文本型字段,支持中文字段名;
参数3:重排序起始值,默认从1开始重排,也可以修改重排的起始值如1000、2000等,以2000、2001、2002排序;
参数4:备份库保存路径,这里选择路径文件夹即可,工具会按照时间戳给备份库命名并复制备份库。

我设置的地理数据库是某地类库,重排字段名称为BSM,重排起始值为1,备份库保存路径为 “D:\临时” ,运行结果如下图:
7

8

4 更新补全字段、空值赋值

在编辑地理数据库的时候,新增的要素往往来不及给标识码赋值,结果产生一些要素的BSM字段为空值,或者对某些选中的要素进行标识清空操作。或者是某些字段需要统一赋相同值,如要素代码。

如何实现这两个功能?

思路如下:
工具设定的是给空值字段赋值,可以是空值null,也可以是填充的空格,所以在使用工具前,需要思考自己想要实现的操作。
工具仅对空值或者空格值的要素进行操作,所以数据安全有保障。

情况1: 统一赋值,即对某个字段填写相同的值,前提条件是该字段为空,否则只填写那些字段为空值的要素。可以使用字段计算器 “字段 = null” 对字段提前清空,经过这种深思熟虑思考的操作后,也就免除了数据备份工作,代表着这一步骤并不是误操作。

情况2: 更新补全字段,针对空值的要素,有一个起始值,从起始值开始续排字段。这就要提前知道该地理数据库中现有的最大值标识码,可以使用我编写的工具 快速查找最大标识码BSM工具 查询出最大标识码,作为补全操作的起始值。

(1) 判定字段是否存在

首先要判定字段是否缺失,字段缺失将跳过该图层。满足条件后,开始后续的补全操作。

(2) 起始值(仅可以填写整数)

对空值字段操作的起始值,如果是统一赋值则表示选定字段都填写 该起始值。
如果是补全字段,则从起始值(含)开始每次+1续排。
因为要进行 加法计算,所以 起始值只能填写整数,即全都是数字组成的,纯数字组成的字符型也可以。

(3) 选择递增值,工具判定统一赋值操作还是补全字段操作

每次递增值,有 0 、 1 两个选项:
选择递增值为 0,表示进行统一赋值操作,对字段统一赋值为起始值;
选择递增值为 1,表示补全字段操作,从起始值(含)进行 +1 续排。

关键代码 :

my_workspace = 数据库
field_name = 字段名称
starting_value = 起始值
incremental_value = 递增值
countvalue = 0  # 更新要素的计数,更新了多少个def updpdateFc(my_workspace, field_name, starting_value, incremental_value, countvalue=0):
......for row in cursor:if row[0] is None or row[0] == "" or row[0] == " " or row[0] == "  " or row[0] == "   ": #找到空值 或 空格值row[0] = starting_valuecursor.updateRow(row)if incremental_value != 0:    # 判定,如果递增值 不是 0,表示补全更新,starting_value +1 续排。starting_value = starting_value + incremental_value   # 过程最大值countvalue += 1                              # 更新要素的计数......

(4) 根据两种不同操作,输出不同结果语句

使用 if 判定,输出两种不同的结果语句。

关键代码 :

if incrementalvalue != 0:starting_value, countvalue = updpdateFc(myworkspace, fieldname, int(startingvalue), int(incrementalvalue))arcpy.AddMessage("更新起始值 " + str(startingvalue) + ",终了最大标识码 " + str(starting_value-1) + ",更新数量 " + str(countvalue) + "。")
else:starting_value, countvalue = updpdateFc(myworkspace, fieldname, startingvalue, incrementalvalue)arcpy.AddMessage("空值字段统一赋值成功,赋值数量 " + str(countvalue) + "。")

(5) 运行效果

我制作了arcgis工具箱工具 更新补全字段BSM工具,空值字段赋值工具,有需要的可以去下载使用,下图是运行界面:

9

参数1:输入mdb和gdb地理数据库,支持中文目录;
参数2:指定查询的字段名称,可以是数值型字段和文本型字段,支持中文字段名;
参数3:起始值,仅可以输入整数;
参数4:每次递增值,选择 0 表示统一赋值为 起始值; 选择 1 表示 从起始值(含) +1 续排。

我设置的地理数据库是准备好的 test.mdb,字段名称为BSM,起始值为2144477777,递增值选择 0 ,即 统一赋值操作,运行结果如下图:
10
递增值选择 1 ,即 更细补全字段操作,运行结果如下图:

11

5 后记

地理数据库的标识码BSM,是日常工作中经常需要维护的一个工作,尤其有些数据库更新工作,去年的旧库作为今年的基础库,这种库的标识码一般情况下是不允许重排的。这种情况下,就需要掌握 旧库的标识码信息,如最大值等等,方便后续工作。网络上也有类似的标识码更新工具,只有一个运行操作,结果不透明,不知其所以然。

我就自己编写了这几个工具,主要是能够输出记录,方便历史查阅。这些工具也可以用于给字段赋值,兼容数值型字段和字符型字段(纯数字组成),支持中文路径,支持mdb和gdb格式地理数据库。

编写arcgis工具的过程,也练习了arcpy的编程,这也是一个学习的过程,大家多多支持,多收藏多点赞,一起共勉之。

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

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

相关文章

C 深入指针(4)

目录 一、字符指针变量 1 初始化 2 与字符串数组的区别 二、数组指针变量 1 初始化 2 二维数组传参本质 三、函数指针变量 1 初始化 2 用法 四、typedef关键字 五、函数指针数组 一、字符指针变量 1 初始化 //VS2022 x64 #include <stdio.h> int main() {…

供应链投毒预警 | 开源供应链投毒202404月报发布(含投毒案例分析)

概述 悬镜供应链安全情报中心通过持续监测全网主流开源软件仓库&#xff0c;结合程序动静态分析方式对潜在风险的开源组件包进行动态跟踪和捕获&#xff0c;发现大量的开源组件恶意包投毒攻击事件。在2024年4月份&#xff0c;悬镜供应链安全情报中心在NPM官方仓库&#xff08;…

利用远程控制软件FinalShell远程连接虚拟机上的Linux系统(Windows)

一. VMware Workstation 安装CentOS Linux操作系统 传送门&#xff1a;VMware Workstation 安装CentOS Linux操作系统 1.右键打开终端 2.输入ifconfig 找到ens33对应 inet的id&#xff0c;这个就是虚拟机的ip地址图中所示为&#xff1a;192.168.5.128 3.打开finalshell 如…

YOLOv5改进 | Neck | 添加双向特征金字塔BiFPN【小白轻松上手 | 论文必备】

&#x1f680;&#x1f680;&#x1f680;本专栏所有的改进均可成功执行&#x1f680;&#x1f680;&#x1f680; 尽管Ultralytics 推出了最新版本的 YOLOv8 模型。但YOLOv5作为一个anchor base的目标检测的算法&#xff0c;YOLOv5可能比YOLOv8的效果更好。但是针对不同的数据…

抖店商品详情API接口(产品参数|详情图)

抖店商品详情API接口(产品参数|详情图) 参数仅供参考&#xff1a; {"code": 0,"msg": "调用成功","time": "1715763239","data": {"properties": [{"format": [{"message": [{&q…

Linux(九) 信号

目录 一、什么是信号 二、信号的种类 三、信号的产生 3.1 通过终端按键产生信号 Core Dump 核心转储 3.2 调用系统函数向进程发信号 3.3 由软件条件产生信号 3.4 硬件异常产生信号 四、信号的注册 五、信号的注销 六、信号的三种处理方式 七、信号的递达阻塞未决 八…

摸鱼大数据——大数据导论

大数据导论 1、概念 大数据时代: 万物皆数据 ​ 数据概念: 人类的行为及产生的事件的一种记录称之为数据 ​ 数据价值: 对数据的内容进行深入分析&#xff0c;可以更好的帮助了解事和物在现实世界的运行规律 2、大数据诞生 大数据的诞生: 跟随着互联网的发展的,当全球互联…

【面试干货】一个数组的倒序

【面试干货】一个数组的倒序 1、实现思想2、代码实现 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、实现思想 创建一个新的数组&#xff0c;然后将原数组的元素按相反的顺序复制到新数组中。 2、代码实现 package csdn;public class…

ssl证书价格一年多少钱?如何申请?

由于行业新规&#xff0c;现在阿里云、腾讯云等几乎所有平台都不再提供一年期免费证书&#xff0c;如果需要一年期证书则需要支付一定的费用。SSL证书的价格根据类型不同几十到几百上千不等。 一年期SSL证书申请通道https://www.joyssl.com/?nid16 一年期SSL证书申请流程&am…

13、24年--信息系统治理——IT审计

1、IT审计基础 1.1 IT审计定义 无重要的考点,自己读课本了解即可。 1.2 IT审计目的 1)IT审计的目的是指通过开展IT审计工作,了解组织IT系统与IT活动的总体状况,对组织是否实现IT目标进行审查和评价,充分识别与评估相关IT风险,提出评价意见及改进建议,促进组织实现IT目…

【网络安全】【Frida实战案例】某图xx付费功能逆向分析(一)

文章目录 一、目标应用二、环境三、步骤1、查看布局id2、用到的Log日志类信息3、尝试hook VIP判断方法 四、总结五、相关源码 1、【网络安全】【Frida实践案例】某图xx付费功能逆向分析&#xff08;一&#xff09; 2、【网络安全】【Frida实践案例】某图xx付费功能逆向分析&…

【多表查询】---------------------三大范式

1.笛卡尔积 #查询的是笛卡尔积 select * from tb_emp,tb_dept; #消除无效的笛卡尔积 select * from tb_emp,tb_dept where tb_emp.dept_id tb_dept.id; 2.内连接 外连接 内连接 内连接&#xff1a;交集 左外连接、右外连接 #隐式内连接 select tb_emp.name ,tb_dept.name…

TCP服务器实现将客服端发送的信息广播发送(使用内核链表管理客户端信息)

目录 1.服务器端实现思路 2.服务器端代码 3.客户端代码 4.内核链表代码 5.运行格式 一、服务器端 二、客户端 6.效果 1.服务器端实现思路 Tcp广播服务初始化 等待客户端连接 广播发送 2.服务器端代码 #include "list.h" #include <signal.h> #def…

如何看固态硬盘是否支持trim功能?固态硬盘开启trim数据还能恢复吗

随着科技的飞速发展&#xff0c;固态硬盘&#xff08;SSD&#xff09;已成为电脑存储的主流选择。相较于传统的机械硬盘&#xff0c;固态硬盘以其高速读写和优秀的耐用性赢得了广泛好评。而在固态硬盘的众多功能中&#xff0c;TRIM功能尤为关键&#xff0c;它能有效提升固态硬盘…

上传文件,服务器报500错误

项目场景&#xff1a; 今天项目上出现一个耗时比较长的问题&#xff0c;但是问题很简单&#xff0c;一开始没注意&#xff0c;导致耗时很久&#xff0c;到底是咋回事儿呢&#xff0c;请看下文~~ 问题描述 用户使用APP上传图片&#xff0c;出现 附件上传失败:服务器响应失败 的…

The 13th Shandong ICPC Provincial Collegiate Programming Contest

The 13th Shandong ICPC Provincial Collegiate Programming Contest The 13th Shandong ICPC Provincial Collegiate Programming Contest A. Orders 题意&#xff1a;有n个订单&#xff0c; 每日可生产k个产品&#xff0c;每个订单给出交付日和交付数量&#xff0c;是否能…

究极完整版!!Centos6.9安装最适配的python和yum,附带教大家如何写Centos6.9的yum.repos.d配置文件。亲测可行!

前言&#xff01; 这里我真是要被Centos6.9给坑惨了&#xff0c;最刚开始学习linux的时候并没有在意那么的&#xff0c;没有考虑到选版本问题&#xff0c;直到23年下半年&#xff0c;官方不维护Centos6.9了&#xff0c;基本上当时配置的文件和安装的依赖都用不了了&#xff0c…

OpenAI发布会最新消息!ChatGPT新功能发布!

关于即将发布的内容&#xff0c;OpenAI 官方帖子提供的唯一细节是&#xff0c;此次发布将更新 ChatGPT 及其最新模型 GPT-4。 OpenAI 员工程博文&#xff08;Bowen Cheng&#xff09;跟了个帖&#xff0c;「比 gpt-5 更酷」&#xff0c;不过又迅速删帖。 OpenAI 的葫芦里到底卖…

电商秒杀系统设计

业务流程 系统架构 系统挑战 高并发:秒杀活动会在短时间内吸引大量用户,系统需要能够处理高峰时期的大量并发请求 库存同步:在秒杀中,面临的一个严重系统挑战是如何确保在数以万计的用户同时抢购有限的商品时,如何正确、实时地扣减库存,以防止超卖现象。 防止恶意抢购和…

儿童护眼台灯哪个牌子好,适合儿童使用的护眼台灯推荐

护眼台灯在近几年成为家长和经常与电子设备打交道的人士中备受瞩目的家用电器。对于有孩子的家庭而言&#xff0c;它几乎成为了必备品&#xff0c;许多消费者已经对其有了一定的了解并进行了购买。然而&#xff0c;仍有部分家长对护眼台灯的效果和重要性缺乏充分认识&#xff0…