从唯一的id mysql生成自动增量值

时间:2016-04-19 17:46:04

标签: mysql

我在一个表中根据id收集具有不同类型值的相同类似数据:

 +------+---------------+-----------------+----------------+ 
 |  id  |   TransID     |     Amount      |   InsertDate   |
 +------+---------------+-----------------+----------------+ 
 |  1   |      1        |       12        |   19-03-2004   |
 |  2   |      2        |       9         |   20-03-2004   |
 |  3   |      3        |       4         |   21-03-2004   |
 |  4   |      1        |       12        |   22-03-2004   |
 |  5   |      2        |       9         |   23-03-2004   |
 |  6   |      3        |       4         |   24-03-2004   |
 |  7   |      1        |       12        |   25-03-2004   |
 +------+---------------+-----------------+----------------+ 

当我根据TransID为1选择表时,我希望根据表的id为记录设置唯一的自动增量ID。

怎么做?所以结果将是

 +------+---------------+-----------------+----------------+--------------- 
 |  id  |   TransID     |     Amount      |   InsertDate   | NewGeneratedID
 +------+---------------+-----------------+----------------+----------------- 
 |  1   |      1        |       12        |   19-03-2004   |       1
 |  4   |      1        |       12        |   22-03-2004   |       2
 |  7   |      1        |       12        |   25-03-2004   |       3
 +------+---------------+-----------------+----------------+ ---------------

当我选择只有表格的特定id时,例如id为4,它会给我NewGeneratedID为2而不是1.

 +------+---------------+-----------------+----------------+--------------- 
 |  4   |      1        |       12        |   22-03-2004   |       2
 +------+---------------+-----------------+----------------+ 

6 个答案:

答案 0 :(得分:8)

您可以根据需要使用以下查询

var buf = Regex.Matches(data,@"\d+").Cast<Match>()
               .Select(x => byte.Parse(x.Value))
               .ToArray();

答案 1 :(得分:8)

我必须警告你,下一个查询效率低下,但它可以达到你所需要的效果。

SELECT t.id, t.TransID ,t.Amount, t.InsertDate, 
    (SELECT COUNT(id) FROM table1 AS aux 
     WHERE t.TransID = aux.TransID and aux.id <= t.id)
FROM table1 t 
WHERE t.TransID = 1  ORDER BY id;

如果您需要的过程在时间上很关键,则不应使用此查询。但是,如果您只想获得一条记录,则最好使用以下有效的查询。

SELECT t.id, t.TransID , t.Amount, t.InsertDate, COUNT(*)
FROM table1 t inner join table1 aux where t.TransID = aux.TransID
WHERE aux.id <= t.id and t.id = 4
GROUP BY t.id, t.TransID , t.Amount, t.InsertDate;

更新:限制aux.id <= t.id通过计算存在较少id的元素数来确定元素之间的顺序。例如,具有id 4 的行的一行具有较小的id(1)用于同一事务,而具有id 7 的行具有两行具有较小id(1和4的行) )

答案 2 :(得分:5)

如果您计划为其添加一列,则可以使用MySQL INSERT TRIGGER类似下面的内容:

CREATE TRIGGER INSERT_Trigger BEFORE INSERT ON Your_Table
FOR EACH ROW BEGIN
  SET NEW.NewGeneratedID = (SELECT COUNT(*)+1 FROM Your_Table WHERE TransID = NEW.TransID);
END

编辑:策略是这样的,如果您使用NewGeneratedID的物理列,那么对于表中的每个插入,计算TransID已存在的ROW数量(新行)并按计数+ 1设置NewGeneratedID(新行)。请记住,如果需要从表中删除,则必须使用AFTER DELETE触发器才能使NewGeneratedID保持一致。

答案 3 :(得分:4)

根据TransactionID选择时使用以下查询

SELECT t.id,t.TransID ,t.Amount,t.InsertDate ,(@num:=@num+1) AS
NewGeneratedID  FROM MyTable t 
cross join (SELECT @num:=0) AS dummy  where t.TransID=1  ORDER BY id;

对于id条件检查,请使用以下查询

select t1.* from 
(SELECT t.id,t.TransID ,t.Amount,t.InsertDate,
(@num:=@num+1) AS  NewGeneratedID  
FROM MyTable t 
cross join (SELECT @num:=0) AS dummy  
where t.TransID=1  ORDER BY id) t1 
where t1.id=4 ;

答案 4 :(得分:4)

这是我对你在问题中理解的建议:

如果为NewGeneratedID生成的增量ID将是永久性的:

  • 更新表并插入新生成的ID
  • 之后,您现在可以轻松选择给定的idNewGeneratedID

如果为NewGeneratedID生成的新ID只是暂时的:

  • 选择并生成增量ID后,将它们保存在 临时表(见CREATE TABLE
  • 当数据保存在临时表中时,您现在可以选择一个 给定idNewGeneratedID
  • 在会话结束后清除或删除临时表中的数据

答案 5 :(得分:0)

id字段是否已经足够独特?你为什么不用它?如果您绝对需要一个新字段,您只需在id字段中添加一个或任意数字,并在每个插入上生成另一个值。即New Field = ID + Constant。