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

请问有没有比较好的办法在插入 mysql 的时候,把自动生成 id 同时加到另一个字段

  •  
  •   meteor2013 · 2020-10-15 23:29:18 +08:00 via iPhone · 3216 次点击
    这是一个创建于 1497 天前的主题,其中的信息可能已经有所发展或是发生改变。
    谢谢啊

    对了,不用 trigger 实现
    25 条回复    2020-10-19 09:34:30 +08:00
    luckyrayyy
        1
    luckyrayyy  
       2020-10-15 23:59:26 +08:00
    完全想不到这么做的意义....
    meteor2013
        2
    meteor2013  
    OP
       2020-10-16 00:03:08 +08:00 via iPhone
    @luckyrayyy 兄台,有些时候一言难尽。能否只提供办法
    Jacky23333
        3
    Jacky23333  
       2020-10-16 00:04:45 +08:00 via Android
    分两步啊
    wsfdljy
        4
    wsfdljy  
       2020-10-16 00:17:11 +08:00
    建个 view 查询的时候用,然后把 id 那个字段取两个别名。
    wsfdljy
        5
    wsfdljy  
       2020-10-16 00:25:16 +08:00   ❤️ 1
    非要存两列,可以试下在一个事务里:先 insert,然后 update table set xx=LAST_INSERT_ID() where id = LAST_INSERT_ID();
    只是一个想法,没验证过,你自己试一下。
    lpts007
        6
    lpts007  
       2020-10-16 00:54:36 +08:00   ❤️ 2
    “一言难尽”的事能具体说说吗,大家对此很好奇。问题本身根本不关心。


    e.g. 我坐地铁前必须把拳头塞进嘴里,但是嘴巴撑得慌,请问大家有什么好办法?
    提出这种问题,不要怪大家问你为什么要塞进嘴里
    lpts007
        7
    lpts007  
       2020-10-16 00:57:28 +08:00   ❤️ 1
    https://www.v2ex.com/t/685827#reply9


    问题最终怎么解决的,也不回来做记录。再过 100 天又是一贴~
    airqj
        8
    airqj  
       2020-10-16 07:31:51 +08:00 via Android
    虚拟列也许可以
    GiantHard
        9
    GiantHard  
       2020-10-16 07:58:56 +08:00 via iPhone
    iminto
        10
    iminto  
       2020-10-16 08:42:03 +08:00
    很简单,模拟序列就好了
    defage
        11
    defage  
       2020-10-16 09:36:17 +08:00
    来个存储过程就好了。
    这个在很多需要审计的数据中很常见,DB 一层记录行为,防止有人利用程序干涉数据安全
    defage
        12
    defage  
       2020-10-16 09:37:44 +08:00
    不用触发器相当于就是要尿尿又不让用 jj
    makia98
        13
    makia98  
       2020-10-16 09:59:31 +08:00
    用事务啊
    1194129822
        14
    1194129822  
       2020-10-16 10:45:02 +08:00
    没什么一步方法,LAST_INSERT_ID()线程安全,但是是 connection 连接后上一个插入的自增 id,没插入前还没生成。
    select auto_increment from information_schema.tables where table_schema ='db_name' and table_name='xxx';
    线程不安全,auto_increment connection 共享。
    所以保证原子性,一致性。只能用事务,先插入再更新。
    DavidNineRoc
        15
    DavidNineRoc  
       2020-10-16 10:52:37 +08:00
    所以说有什么用呢?
    gochat
        16
    gochat  
       2020-10-16 11:02:05 +08:00
    @lpts007 我说一个我之前看到的很傻的场景,前端要求后端生成分享的 url,一个表里面假设有 id,share_url 两个字段,而 share_url (假设为: https://www.test.com/test/test?id=xxx )中的 GET 参数有个 id 字段,等于当前表里的 id,你在新增表记录的时候,并不知道这个 id 是多少,只能 insert 后再去 update 。
    seanxx
        17
    seanxx  
       2020-10-16 11:21:11 +08:00
    手动生成,不用自增
    lpts007
        18
    lpts007  
       2020-10-16 13:22:03 +08:00 via Android
    @gochat 表里存不存 url,前端管的到这个?
    mosliu
        19
    mosliu  
       2020-10-16 13:34:21 +08:00
    @defage 这个世界上尿尿不用 jj 的还是有一半人的。。。
    想半天。
    gochat
        20
    gochat  
       2020-10-16 14:01:50 +08:00
    @lpts007 接口读不大到这个 url,那就出出错啊,我说的是这个场景,这个 url 必须你提供,但 url 地址又跟自增 id 有关系,在新增的时候你又不知道 id 是多少,听明白了之间的矛盾了不
    DoUSeeMe
        21
    DoUSeeMe  
       2020-10-16 14:06:58 +08:00
    @lpts007 #6 虽然我也好奇,但是拳头塞嘴里这个举例有点过了。。。
    lpts007
        22
    lpts007  
       2020-10-16 14:14:04 +08:00 via Android
    @gochat 表里就是不存,查的时候,接口里处理好给前端,前端不答应?重复网址往数据库里塞是看不起通管局还是公司前端负责表结构?

    我的表达是否清楚?
    gochat
        23
    gochat  
       2020-10-16 14:19:10 +08:00
    @lpts007 规则都说不定,搞不好还是自定义配置的 url (此时 id 参数不需要),日积月累的,现实还真不是你想的那么简单,所以我说这是很傻的
    lpts007
        24
    lpts007  
       2020-10-16 14:22:37 +08:00 via Android
    @gochat
    规则都说不定
    谢谢,了解了,舒服了。
    cbasil
        25
    cbasil  
       2020-10-19 09:34:30 +08:00
    @gochat 分享 url 中 id 字段为什么要用自增 id 呢,手动生成一个唯一字段 share_id,可以根据用户 uid 和时间戳生成,然后查询和 url 中用 share_id 作为参数。就不需要 insert 再去 update 了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3267 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 12:11 · PVG 20:11 · LAX 04:11 · JFK 07:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.