【问题标题】:auto increment in Mysql database table with my own choice使用我自己的选择在 Mysql 数据库表中自动递增
【发布时间】:2017-11-19 01:27:49
【问题描述】:

我在 mysql 数据库中有一个名为 oder 的表

         id    user_id   item_id 
         1       55      5813    
         2       55      359     
         3       56      559  
         4       62      4536    
         5       62      484     
         6       99      4698    
         7       29      435

在此表中,“id” 是主键,并且此列的自动增量已打开。现在我想添加一个列,它也应该是自动递增的,并且值类似于 OD-001OD-002。 那么我的桌子应该看起来像

         id    user_id   item_id  order_custom_id
         1       55      5813     OD-001
         2       55      359      OD-002
         3       56      559      OD-003
         4       62      4536     OD-004
         5       62      484      0D-005
         6       99      4698     OD-006
         7       29      435      OD-007

注意:我目前正在研究 PHP Laravel 框架。我已经阅读了很多问题和文章,但对我来说没有任何结果,

【问题讨论】:

  • 添加一个插入触发器,为每个插入的记录构建 ID
  • 在创建时我必须在哪里添加触发器?
  • 在您的 mysql 服务器中,因为触发器将在该表的每个插入操作上运行。
  • 您可以使用存储过程和始终返回自定义自动增量字段的最后存储值的函数生成自定义自动增量值,如Custom Auto Increment Field中所述

标签: php mysql


【解决方案1】:

如果想通过 php 执行此操作,并且您的表像模型一样,并且您的 order_custom_id 始终以 id 结尾,您可以使用 laravel 事件并通过获取表的最后一个 id + 1 来创建它。

public static function boot()
{
    parent::boot(); // Validate the model
    static::creating(function ($your_model) {
        $prev_model = YourModel::orderBy('id', 'desc')->first();
        $id = ($prev_model) ? ($prev_model->id +1) : 1;
        $your_model->order_custom_id = sprintf('OD-%s', str_pad($id, 3, "0", STR_PAD_LEFT));
    });
}

【讨论】:

    【解决方案2】:

    如果我理解正确,您希望根据自增列值生成列值(例如 1 -> OD-001)。

    我想到的第一个想法是使用auto computed columns。不幸的是,MySQL does not seem to support this feature.(它与如何在内部生成自动递增和自动计算的列值有关):

    生成的列“computed_col”不能引用自增列。

    另一种方法是在插入时使用触发器更新另一列,但我个人尽可能避免使用触发器,因此使用视图可能是一个不错的解决方案:

    CREATE VIEW orderView AS
    SELECT id, user_id, item_id, CONCAT('OD-', LPAD(id, 3, '0')))
    FROM order 
    

    我看到的唯一缺点是值不会持久化并且是动态计算的(更多 CPU)。但是,这对于相当少量的选定行(

    注意:使用视图而不是单独的列也遵守3NF

    【讨论】:

      【解决方案3】:

      你可以试试这样的:

      INSERT INTO table (user_id, item_id)
      VALUES (20, CONCAT('OD-', LPAD((SELECT ISNULL(MAX(id) + 1, 1) FROM table), 3, '0')));
      

      这将从您的表中选择下一个增量 id,并将其添加到 OD- 前面并带有前导零。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-20
        • 2017-04-26
        • 1970-01-01
        • 2012-04-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多