【问题标题】:MySQL insert with this increment id使用此增量 ID 插入 MySQL
【发布时间】:2019-09-11 06:44:30
【问题描述】:

我有一个logs 表,其中包含idlog_stringcreated_at

logs 的 DDL:

CREATE TABLE `logs` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `log_string` varchar(255) NULL,
    `created_at` datetime DEFAULT NULL
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4

log_string 列由 concat idcreated_at 和一些字符串组成,我通过两次插入来做到这一点:

$log = App\Log::create(); //insert at the first time
$logString='This is log '.$log->id.'('.$log->created_at.')';
$log->update(['log_string'=>$logString]); //insert at the 2nd time

只插入一次就可以做到吗?

MySQL 中有一个LAST_INSERT_ID(),但没有THIS_INSERT_ID(),知道吗?

【问题讨论】:

标签: mysql laravel laravel-5 eloquent


【解决方案1】:

您想要获取下一个插入 id 和创建下一个日志条目的时间戳 (created_at)。所以,换句话说,你想要有未来的条目:)

所以不,这是不可能的。您可以通过查看当前 id 是什么来预测它,然后自己将其增加 1,因为这可能是下一个日志 id。但是这种方法非常不受欢迎,因为如果您在多个地方管理此表逻辑,您永远不知道下一个 id 会是什么,因为许多脚本会在不同的时间间隔内更改表。

因此,没有办法在一个查询中做到这一点。但是,您可以编写一个每天填写一次 log_string 列的 cron,例如:

UPDATE logs SET log_string = CONCAT("This is log ", id, "(", created_at, ")") WHERE log_string IS NULL;

我没有测试查询,只是给你一个想法。

这样您就不需要每次都运行额外的查询。您只需每天一次左右就可以完成大量条目。

希望对你有帮助

【讨论】:

    【解决方案2】:

    有几种方法可以实现您想要的,但是不可能以一种方便的方式实现。但更重要的是,这不是必需的,因为您的表中已经有 ID。

    打印日志时可以通过sprintf格式化。

    sprintf('This is log %s (%s)', $id, $date);
    

    但是,如果您仍然坚持在日志消息中硬编码 ID,您可以使用 ramsey/uuid 预生成 ID。

    另一种选择是使用消息队列根据需要更新日志表中的消息。

    【讨论】:

      【解决方案3】:

      你可以使用"Observer"

      类似的东西:

      namespace App\Observers;
      
      use App\Log;
      
      class LogObserver
      {
          /**
           * Handle the Log "created" event.
           *
           * @param  \App\Log  $log
           * @return void
           */
          public function created(Log $log)
          {
              $log->log_string = $log->id . ' (' . $log->created_at . ')';
              $log->save();
          }
      

      【讨论】:

        【解决方案4】:

        如果您的 ID 是 AUTO INCREMENT,那么如果没有至少两个请求,就不可能实现您想要的。


        但是,如果您向模型添加 自定义属性 并从表中删除 log_string,将会很有趣:

        更新您的表格

        删除 log_string

        CREATE TABLE `logs` (
           `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
           `created_at` datetime DEFAULT NULL
            PRIMARY KEY (`id`)
        ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4
        

        更新您的模型

        然后将 custorm 属性添加到 App\Log.php

        /**
         * Custom attribute for log_string
         *
         * @return string
         */
        public function getLogStringAttribute()
        {
            return "This is log {$this->id} ({$this->created_at})";
        }
        

        访问数据

        $log = App\Log::create(); //insert at the first time
        $log->save(); // save the model to get the id and create_at datas
        echo $log->log_string; // display the log string
        

        【讨论】:

          猜你喜欢
          • 2012-02-22
          • 2013-03-06
          • 2019-11-07
          • 2023-03-30
          • 1970-01-01
          • 2012-02-01
          • 2013-02-28
          • 2017-04-20
          • 1970-01-01
          相关资源
          最近更新 更多