【问题标题】:MySQL: use the id of the row being inserted in the insert statement itselfMySQL:使用插入语句本身中插入的行的 id
【发布时间】:2010-12-11 01:52:25
【问题描述】:

我正在尝试类似的东西:

INSERT INTO dir_pictures SET filename=CONCAT(picture_id,'-test');

picture_id 是我的主键,自动递增。基本上我试图把这个插入语句的 id 放在语句本身中。

我确信可以使用一些额外的 PHP 代码或使用多个语句来完成,但我想知道是否有一种快速简便的方法可以一次性完成。

PS。上面的语句总是把'0-test'

【问题讨论】:

    标签: php sql mysql insert-id


    【解决方案1】:

    先插入一条记录。然后用分号分隔您的语句并使用LAST_INSERT_ID() 获取新插入的自动增量ID。一口气执行。

    插入 dir_pictures .... ; 更新 dir_pictures set filename=CONCAT(LAST_INSERT_ID(),'-test') where id = LAST_INSERT_ID()

    【讨论】:

    • 这可能会导致竞争状况...小心
    • 怎么可能? last_insert_id() 应该是特定于连接的。引用手册:'同时使用来自多个客户端的 LAST_INSERT_ID() 和 AUTO_INCREMENT 列是完全有效的。每个客户端都将收到客户端执行的最后一条语句的最后插入 ID。'
    【解决方案2】:

    只需从 information_schema 中选择表的当前 auto_increment 值作为插入的一部分:

    INSERT INTO dir_pictures SET filename=CONCAT((SELECT auto_increment FROM
    information_schema.tables WHERE table_name='dir_pictures'), '-test')
    

    【讨论】:

    • 是的,这将是在一个声明中做到这一点的方式......但这真的不是一个好主意。我肯定会做一个插入,然后更新。
    • 这很丑陋,并且在内部选择完成和插入运行之间存在一个小的竞争条件。
    【解决方案3】:

    好吧,在插入完成之前,您不会知道行 ID ...所以,我认为这不会起作用!

    为什么不在检索行时只计算文件名?

    INSERT INTO dir_pictures (file_extension) VALUES ('-data')
    
    SELECT picture_id, CONCAT(picture_id, file_extension) as filename
    FROM dir_pictures
    

    【讨论】:

      【解决方案4】:

      这实际上是不可能的,在输出而不是输入时简单地连接它可能符合您的最佳利益。

      SELECT CONCAT(id, '-text') as filename FROM dir_pictures

      【讨论】:

        【解决方案5】:

        如果您真的想在一条 SQL 语句中执行此操作,您可以尝试以下 hack:

        INSERT INTO dir_pictures SET filename=CONCAT((select max(picture_id)+1 from dir_pictures),'-test');

        如果这是一个多线程应用程序,请注意竞争条件...

        另外,我怀疑它是否适用于一张空桌子......

        【讨论】:

        • 我认为如果之前已经删除了一行,这将不准确
        • 是的,谢谢,很好。如果最近添加的行被删除,这将失败。
        猜你喜欢
        • 1970-01-01
        • 2018-09-25
        • 2020-01-14
        • 1970-01-01
        • 1970-01-01
        • 2021-05-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-08
        相关资源
        最近更新 更多