MySQL插入此增量ID

时间:2019-09-11 06:44:30

标签: mysql laravel laravel-5 eloquent

我有一个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(),有什么主意吗?

4 个答案:

答案 0 :(得分:0)

要在创建下一个日志条目(created_at)时获取下一个插入ID和时间戳。因此,换句话说,您想要将来的条目:)

因此,不可能。您可以通过查看当前ID是什么来预测它,然后自己将其递增1,因为这可能是下一个日志ID。但是强烈建议不要使用这种方法,因为如果您要在多个位置管理此表逻辑,您将永远不知道下一个ID是什么,因为许多脚本会在不同的时间间隔更改该表。

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

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

我还没有测试查询,只是为了给您一个想法。

这样,您无需每次都运行额外的查询。您只需每天大约一次即可进行操作。

我希望对您有帮助

答案 1 :(得分:0)

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

打印日志时,您可以通过sprintf对其进行格式化。

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

但是,如果您仍然坚持对日志消息中的ID进行硬编码,则可以使用ramsey/uuid来预先生成ID。

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

答案 2 :(得分:0)

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


但是,如果您向模型中添加 custom属性并从表中删除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

答案 3 :(得分:0)

您可以使用"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();
    }