Mysql->;与其他字段相关的自动递增

Mysql->;与其他字段相关的自动递增,mysql,sql,auto-increment,ddl,Mysql,Sql,Auto Increment,Ddl,我被困在一个项目设计上。其中一个表与用户表有1-M关系。所以它有一个外键。同一字段也是主键 下表 项目ID: 主键 自动增量 用户ID项: 主键 用户表中id的外键 项目名称: 非空 价值观: ----------------------------------------- | **ITEMID** | **USERID** | ITEMNAME | ----------------------------------------- | 1 | 1

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

下表

项目ID:

  • 主键
  • 自动增量
用户ID项:

  • 主键
  • 用户表中id的外键
项目名称:

  • 非空
价值观:

-----------------------------------------
|  **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自动增加项目id组”


有没有一种方法可以使用mysql实现这一点?

您想要这样的东西:


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


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

更安全的方法是考虑到您的应用程序在任何给定时间都可能被多个用户访问

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

至少可以保证将最后插入的id从表A插入表B。

有两个表具有自动递增主键,并且具有1对多关系。我不知道问题出在哪里。很抱歉,我已清除问题并更新了问题。我试图做的是按用户id的出现次数自动递增itemid。如果用户id='theid'集合%maxid=%maxid+1,则在表项上插入时应使用触发器
为每行开始在表上插入之前分别创建触发器ai;结束;INSERT INTO table VALUES('theid',%maxid,'foo')
我成功地编写了这个触发器,但触发器需要插入的用户id。是否可以将值插入触发器@这正是我想要的。dml似乎比我想象的更有能力。非常感谢。旁注:这是DDL,触发器创建是DDL@User2102266如果多个用户同时尝试访问它,会发生什么情况?max(item_id)可能是个问题。多个用户导致的问题是什么意思?我贴出了答案。在你的房间里安全吗@这不会发生,因为每个插入都会等待另一个插入。他认为,如果多个插入同时运行,这将导致触发器无法获取相同的max(id),此外,如果根本没有itemid,则不测试max(itemid),这将返回null,null+1保持null,因此所有表itemid都将充满null
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
//
INSERT INTO table VALUES ( 
(SELECT (MAX(itemid)+1)
FROM table
WHERE userid = 'theid') , 'theid' , 'foo1');
START TRANSACTION;
 Insert into table A
 Select Last inserted id from table A using Last_Insert_ID()
 Update table B
COMMIT;