我被困在项目设计上。其中一个表与用户表具有1-M关系。所以它有一个外键。相同的字段也是主键。
表格如下
ITEMID:
Useriditem:
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做到这一点?
答案 0 :(得分:2)
你想要这样的东西:
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)
我不知道当多个用户执行查询时会发生什么,但我认为我设法缩小算法范围。
INSERT INTO table VALUES (
(SELECT (MAX(itemid)+1)
FROM table
WHERE userid = 'theid') , 'theid' , 'foo1');
这可以解决多用户问题的同时执行。