【问题标题】:Custom format example for serial number creation in mysqlmysql中序列号创建的自定义格式示例
【发布时间】:2013-07-30 18:00:19
【问题描述】:

我最近从 OpenOffice Base 切换到 MySQL 社区。在 ooBase 中,您可以在将整数输入数据库时​​对其进行自定义。例如,我可以输入 2013_00000,然后此列中的每个数字都将以这种方式格式化(2013_00001、2013_00002、...)。在与 MySQL 社区玩了一段时间后,我注意到没有明显的方法来格式化这样的自定义整数。我可能忽略了一些基本的东西,但如果有人知道如何做到这一点,请告诉我。谢谢

【问题讨论】:

  • Afaik,你需要一个触发器。
  • 您是否必须插入 格式化值,或者您是否需要一种方法来格式化您的select 语句返回的值?
  • @SylvainLeroux 插入格式化值。目前只是所有整数,但我想将年份作为前缀添加到数字

标签: mysql database integer


【解决方案1】:

为了在插入数据之前对其进行操作,您需要trigger

类似的东西:

CREATE TRIGGER ins_sn BEFORE INSERT ON tbl
FOR EACH ROW
    SET NEW.sn = CONCAT(LEFT(NEW.sn, 4), '_', RIGHT(NEW.sn,5));

如果您需要更新行,则需要第二个触发器:

CREATE TRIGGER upd_sn BEFORE UPDATE ON tbl
FOR EACH ROW
    SET NEW.sn = CONCAT(LEFT(NEW.sn, 4), '_', RIGHT(NEW.sn,5));

完整示例请参见http://sqlfiddle.com/#!2/01428/1

在这里,为了简单起见,我使用了CONCAT()LEFT()RIGHT() 函数。也许您的数据需要更复杂的操作(即:填充)。 MySQL 有一组丰富的string functions。反正这是原则。

【讨论】:

  • 我确实需要更新。因此,当您说更新时触发时,您只是意味着这样写: CREATE TRIGGER ON UPDATE ins_sn BEFORE INSERT ON tbl
  • @user2618927 我编辑了答案(和 sqlfiddle 演示)来演示 ON INSERTON UPDATE 触发器。
【解决方案2】:

不是最灵活的(这里锁定为下划线分隔符),但您可以使用触发器来做到这一点,就像这样;

CREATE TRIGGER trig_MyTable BEFORE INSERT ON MyTable
FOR EACH ROW
BEGIN
  SELECT seq into @seq FROM MyTable_Seq FOR UPDATE;
  SET NEW.id = @seq, @cutoff = LOCATE('_', @Seq);
  UPDATE MyTable_Seq SET Seq = 
         CONCAT(LEFT(@seq, @cutoff), 
                LPAD(SUBSTR(@seq, @cutoff+1)+1, LENGTH(@seq)-@cutoff, '0')); 
END;
//

An SQLfiddle to test with.

【讨论】:

  • 好的,我了解您使用此代码的原理。我希望有一个更简单的点击式解决方案,但我会尝试使用触发器。感谢您的想法
猜你喜欢
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 2012-03-05
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多