使用我自己的数字自动增加字母表

时间:2014-03-10 14:37:22

标签: php mysql

我想在我的mySQL上自动增加id作为我的id。这个id将保存在mySQL中。抱歉我的英语不好;也许大多数人都不会明白我在说什么。让我举个例子。

像这样:

  

abc / def / 001(001)直到abc / def / 001(100)

自动增量ID将自动更改为

  

ABC / DEF / 002(001)。

这可能吗?

任何人都可以帮助我吗?

非常感谢。

(我想更新我的问题)

这可以用php代码或者用PHP代码生成器写入并保存到mysql中吗?

2 个答案:

答案 0 :(得分:0)

您可以使用2列来实现这一目标。其中一个是正常的自动增量整数值,第二个是每当使用触发器插入新行或使用CONCAT()手动插入时更新:

$query = "INSERT INTO table1 (column1,colum2,column3) VALUES (1,2,3)";
mysqli_query($link,$query);
$last_insert_id = mysqli_insert_id($link);
$query = "UPDATE table1 SET my_auto_increment = CONCAT('abc/def/', id) WHERE id = '$last_inserted_id'" // where id is an integer auto increment field
mysqli_query($link,$query);

答案 1 :(得分:0)

使用MySQL AUTO_INCREMENT无法做到这一点。至少,不像你描述的那样直接。但是可以模仿这种行为。


但首先,作为一个方面,我质疑数据库中是否需要这种类型的连接标识符。这是有问题的,并且会导致更多的问题和悲伤,比你现在预期的更多。如果我必须包含这样的列,我就不会把它作为主键。

我强烈主张代理整数键,因为它们符合理想主键的所有理想方面:简单,独特,匿名,不可变等。代理键上有两种思想流派:(1)那些认为代理键是非常好的东西,(2)那些通过选择自然键而没有被烧掉的人。

我不知道您要解决的问题,或者知道您的要求是什么。但是如果你有一个选项可以避免在数据库中存储这种类型的标识符,我强烈建议你认真考虑利用这个选项。

MySQL本身不支持生成像你这样的标识符,这是有充分理由的。他们很容易陷入困境,引起悲伤,并且是个坏主意。

除了那个广告......


为了使数据库能够自动"生成该列的值(即,如果该列的值未作为SQL插入语句中的值提供),则可以定义BEFORE INSERT触发器为其生成它。

触发器可以使用整数AUTO_INCREMENT列生成唯一值,然后使用该整数值作为表达式的一部分来生成所需的字符串。

此演示查询显示一个表达式,它将生成指定格式的字符串... i是唯一的整数值,a是一个生成第一个整数的表达式,演示了如何获取第一个整数组件b是第二个整数组件,val以指定格式连接在一起。

SELECT t.i
     , (t.i DIV 100 - IF(t.i MOD 100,0,1)) a
     , (t.i MOD 100 + IF(t.i MOD 100,0,100)) b
     , CONCAT('abc/def/'
       ,IF(t.i>100000
         ,(t.i DIV 100 - IF(t.i MOD 100,0,1))
         ,RIGHT(CONCAT('00',(t.i DIV 100 - IF(t.i MOD 100,0,1))),3)
        )
       ,'('
       ,RIGHT(CONCAT('00',(t.i MOD 100 + IF(t.i MOD 100,0,100))),3)
       ,')')
       AS val
  FROM ( SELECT 101 AS i
         UNION ALL SELECT 199
         UNION ALL SELECT 200
         UNION ALL SELECT 201
         UNION ALL SELECT 299
         UNION ALL SELECT 300
         UNION ALL SELECT 301
         UNION ALL SELECT 100000
         UNION ALL SELECT 100001
       ) t

注意:要避免第一个整数组件执行" wrap"对于i大于99900的值,第一个组件需要超过三个位置。

要将该表达式放入触发器以自动生成奇怪的标识符值,您可以执行以下操作:

CREATE TABLE mytable 
( id   INT UNSIGNED AUTO_INCREMENT PRIMARY KEY
, val  VARCHAR(80)
);

请注意,表中的AUTO_INCREMENT列定义为UNSIGNED,因此我们不允许使用负值。 (我们上面的表达式并不是为了处理小于100的值而设计的,因为起始点被指定为" 001(001)",我们的算法具有相应的为整数值1。

DELIMITER $$

CREATE TRIGGER trg_mytable_bi
BEFORE INSERT ON mytable
BEGIN
  DECLARE i BIGINT;
  SET i = 100 + NEW.id;
  SET NEW.val = CONCAT('abc/def/'
       ,IF(i > 100000
          ,((i DIV 100) - IF(i MOD 100,0,1))
          ,RIGHT(CONCAT('00',((i DIV 100) - IF((i MOD 100),0,1))),3)
        )
       ,'('
       ,RIGHT(CONCAT('00',(i MOD 100 + IF(i MOD 100,0,100))),3)
       ,')');
END;
$$

DELIMITER ;

不清楚' abc / def'组件来自。所以,我只是在触发器中对它进行了硬编码。

如果你想为' abc / def /'的不同值运行单独的AUTO_INCREMENT整数值,那么你就可以拥有' abc / def / 001(001)&#39 ;和' ccc / ddd / 001(001)' ...

MyISAM引擎有一个特殊的功能:如果AUTO_INCREMENT列是索引中的辅助列而不是任何其他索引中的前导列,那么MySQL将为前导部分中的每个不同值生成自动增量序列。指数。 (我已经测试过了,但从未真正使用它,因为InnoDB引擎中没有这个功能。)