2013-07-30 29 views
0

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

+0

Afaik,你需要一个触发器。 –

+0

您是否需要*插入*格式化值,或者您是否需要一种方法来格式化* * select *语句返回的值? –

+0

@SylvainLeroux插入格式化值。它目前只是所有整数,但我想添加一年前缀作为我所做的 – user2618927

回答

0

为了在插入数据之前处理数据,您需要一个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。无论如何,这是原则。

+0

号码的前缀,实际上需要更新。所以,当你说更新触发器时,你只需要这样写:CREATE TRIGGER ON UPDATE ins_sn BEFORE INSERT ON tbl – user2618927

+0

@ user2618927我编辑了答案(和sqlfiddle演示)来演示'ON INSERT'和'ON UPDATE触发器。 –

+0

@Sylvain_Leroux好的非常感谢你 – user2618927

0

不是最灵活的(这里锁定到一个下划线分隔符),但你可以用触发器做到这一点,

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)[email protected], '0')); 
END; 
// 

An SQLfiddle to test with

+0

好吧我明白你使用这个代码的原则。我希望有一个更简单的点击式解决方案,但我会尝试使用触发器。感谢这个想法 – user2618927