【问题标题】:Mysql->autoincrementing related to an other fieldMysql->自动递增与另一个字段相关
【发布时间】:2014-03-16 22:53:00
【问题描述】:

我被一个项目设计困住了。其中一张表与 users 表有 1-M 的关系。所以它有一个外键。同一个字段也是主键。

如下表

物品编号:

  • 主键
  • 自动增量

用户名:

  • 主键
  • users表中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 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做到这一点?

【问题讨论】:

  • 您有 2 个具有自动递增主键的表,并且具有一对多的关系。我不明白问题出在哪里。
  • 抱歉,我清除了问题并更新了问题。我想要做的是通过用户 ID 的出现自动增加 itemid。
  • 您应该在表项上的 INSERT 上使用触发器
  • CREATE TRIGGER ai_seperatly BEFORE INSERT ON table FOR EACH ROW BEGIN IF user_id = 'theid' SET %maxid = %maxid + 1; END; INSERT INTO table VALUES ('theid',%maxid,'foo') 我设法写了这个,但触发器需要将插入的用户 ID。是否可以将值插入触发器? @CodeBird

标签: mysql sql auto-increment ddl


【解决方案1】:

你想要这样的东西:

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
//

【讨论】:

  • 这正是我想要的。 dml 似乎比我想象的更有能力。非常感谢。
  • 旁注:这是 DDL,触发器创建是 DDL。 @user2102266
  • 如果多个用户尝试同时访问它会发生什么? max(item_id) 可能是个问题。
  • 多用户导致的问题是什么意思?我发布了一个答案。在你的完美中安全吗? @Mukus
  • 这不会发生,因为每个插入都会等待另一个。他在想,如果许多插入同时运行,这将导致触发器无法获取 max(id)
【解决方案2】:

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

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');

这样可以解决多用户同时执行的问题吗?

【讨论】:

  • 那是一回事,另外如果你不测试你的 MAX(itemid) 如果根本没有 itemid,这将返回 null,并且 null + 1 保持为 null,所以你所有的 table itemid将充满null
【解决方案3】:

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

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

至少您可以保证将最后插入的 id 从表 A 中获取到表 B 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    相关资源
    最近更新 更多