V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tctc4869
V2EX  ›  程序员

如果数据表每一个字段,除去主键字段外都带有唯一约束,那增加与修改的代码流程怎么写是最好的?

  •  
  •   tctc4869 · 2021-07-14 08:47:31 +08:00 · 1583 次点击
    这是一个创建于 989 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个数据表,有 n 个字段,有主键字段,主键内容自动生成。并且还有 n-1 个字段,这些字段都带有自己的唯一约束,并且这些字段的内容不是自动生成的,是人工录入的,现在要求是实现对该数据表的增删改查的页面。

    遇到这种情况,那增加与修改的代码流程(也就是最终调用 insert 和 update 语句的方法),怎么写是最好的?如何把处理该情况的代码流程写的通用一点(封装成一个专门处理此情况的 api 方法)?

    还是每个字段的修改,在 ui 界面上,都用单独的对话框进行修改?

    第 1 条附言  ·  2021-07-14 11:21:32 +08:00
    那么不用 try 他车,用查询方式验证修改增加行的唯一约束的字段内容是否存在记录中,假设数据表字段有 20 个,除去主键,每有一个唯一约束字段的内容就查询数据库验证,如果一行数据有 19 个 20 个,那每一次增加和修改就得搞 19 次验证。要搞 19 次数据库连接访问数据表进行查询验证

    验证增加或修改的数据记录是否在数据表存在,这个验证流程有没有方法能不能缩短一些。
    13 条回复    2021-07-14 21:05:44 +08:00
    lanlanye
        1
    lanlanye  
       2021-07-14 10:06:25 +08:00
    UI 怎么做和你的接口有什么关系?有重复就报错不就完事了
    tctc4869
        2
    tctc4869  
    OP
       2021-07-14 10:17:41 +08:00
    @lanlanye “有重复就报错不就完事了”,这不跟什么都没说一样吗
    timethinker
        3
    timethinker  
       2021-07-14 10:24:33 +08:00
    是每一条数据的组合都唯一吗?还是某一个字段的值是唯一的?
    一般如果违法数据库约束会有报错信息,你 catch 住相关的异常然后响应给客户端对应的结果就行了吧。
    tctc4869
        4
    tctc4869  
    OP
       2021-07-14 10:40:42 +08:00
    @qwe520liao 不是组合唯一,是除去主键的每个字段有独立的唯一约束
    数据库约束会有报错信息,不过还有一种就是查询检测,用 trycatch 检测和通过查询检测,哪个更好一些?
    timethinker
        5
    timethinker  
       2021-07-14 10:48:42 +08:00
    建议查询,一般如果在事务内数据库报错了,会导致事务回滚,显然 try-catch 不适合,你查询的话可以给到客户单更详细的信息。
    saulshao
        6
    saulshao  
       2021-07-14 10:49:42 +08:00
    @tctc4869 4# 这谈不上哪个更好。
    出于效率的考虑,一般直接 try...catch 就行了。除非有特别的需求,才用查询检测。
    原因: Try...catch 代码相对简单一点。
    tctc4869
        7
    tctc4869  
    OP
       2021-07-14 10:57:15 +08:00
    @saulshao trycatch 检测的话,不同的数据库唯一约束报错信息可能不一样,不一定唯一约束报错信息会有指向报错的字段是哪个
    tctc4869
        8
    tctc4869  
    OP
       2021-07-14 11:02:45 +08:00
    @saulshao 如果给 orm 扩展通用性 Api 方法的话,tryCatch 检测是否存在,显然就比较麻烦一些
    lanlanye
        9
    lanlanye  
       2021-07-14 11:09:44 +08:00
    @tctc4869 我不懂你这个需求是基于什么考虑的,难道你对表的增删改查不是以行为单位而是以字段为单位吗?如果这样的话为什么要用关系型数据库?
    lanlanye
        10
    lanlanye  
       2021-07-14 11:16:34 +08:00
    @tctc4869 如果需求是找到重复的字段具体是哪个,Django 的 ORM 就有类似功能可以参考,静态语言我就不清楚了。
    tctc4869
        11
    tctc4869  
    OP
       2021-07-14 11:18:41 +08:00
    @qwe520liao 我目前想到的是有多少字段就差多少次。

    那么增加修改用查询方式,假设数据表字段有 8 个,除去主键,每有一个唯一约束字段的内容就查询数据库验证,那就得搞 7 次验证,验证增加或修改的数据记录是否在数据表存在,这个验证流程能不能缩短一些。
    saulshao
        12
    saulshao  
       2021-07-14 13:43:28 +08:00
    @tctc4869 7#这就是我说的,有特别需求.....
    你的程序中如果只有数据库的 DDL 里才知道到底哪些字段是唯一索引,那么你就需要把这种定义放在代码里。
    这种操作会给你的开发带来更多工作量,同时还会给你的整个开发小组的管理带来更多额外的流程。
    akira
        13
    akira  
       2021-07-14 21:05:44 +08:00
    根据你的需求, 增加删除 产生的实际 sql 代码其实是类似的,做个通用方法去处理就是了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5032 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 09:37 · PVG 17:37 · LAX 02:37 · JFK 05:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.