Mysql->与另一个字段相关的自动递增

时间:2014-03-16 22:53:00

标签: mysql sql auto-increment ddl

我被困在项目设计上。其中一个表与用户表具有1-M关系。所以它有一个外键。相同的字段也是主键。

表格如下

ITEMID:

  • 的PrimaryKey
  • 自动增量

Useriditem:

  • 的PrimaryKey
  • 用户表中的id的外键

ITEMNAME:

  • 不为空

值:

-----------------------------------------
|  **ITEMID** | **USERID** | ITEMNAME   |
-----------------------------------------
| 1           | 1          | fooooooo   |
-----------------------------------------
| 2           | 1          | tinytext   |
-----------------------------------------
| 3           | 1          | MediumText |
-----------------------------------------
| 4           | 2          | LARGEtext  |
-----------------------------------------
| 5           | 2          | HUGETEXT   |
-----------------------------------------
| 6           | 1          | BLOOOOOB   |
-----------------------------------------
| 7           | 3          | 001010101  |
-----------------------------------------

这是当前设计的结果。我想知道的是一种为每个用户单独进行自动增量的方法。

类似于"自动增量项目ID GROUP BY用户ID"

-----------------------------------------
|  **ITEMID** | **USERID** | ITEMNAME   |
-----------------------------------------
| 1           | 1          | fooooooo   |
-----------------------------------------
| 2           | 1          | tinytext   |
-----------------------------------------
| 3           | 1          | MediumText |
-----------------------------------------
|   1         | 2          | LARGEtext  |
-----------------------------------------
|   2         | 2          | HUGETEXT   |
-----------------------------------------
| 4           | 1          | BLOOOOOB   |
-----------------------------------------
|      1      | 3          | 001010101  |
-----------------------------------------

有没有办法用mysql做到这一点?

3 个答案:

答案 0 :(得分:2)

你想要这样的东西:

Demo

CREATE TRIGGER item_id_auto_inc
BEFORE INSERT ON items
FOR EACH ROW 

BEGIN
    SET NEW.item_id := (SELECT CASE WHEN ISNULL(MAX(item_id)) THEN 0 ELSE MAX(item_id) END +1 FROM items WHERE user_id=NEW.user_id);
END
//

答案 1 :(得分:1)

更安全的方法是考虑到您的应用程序在任何给定时间都会受到超过1个用户的攻击

START TRANSACTION;
 Insert into table A
 Select Last inserted id from table A using Last_Insert_ID()
 Update table B
COMMIT;

至少可以保证将表A中最后一次插入的id输入到表B中。

答案 2 :(得分:0)

我不知道当多个用户执行查询时会发生什么,但我认为我设法缩小算法范围。

how to "insert into table (col1, col2) values (select max(id) from table2, select id from table3); "?

INSERT INTO table VALUES ( 
(SELECT (MAX(itemid)+1)
FROM table
WHERE userid = 'theid') , 'theid' , 'foo1');

这可以解决多用户问题的同时执行。