一尘不染

MySQL自动增加具有一个特定主键的列

sql

假设我有一个具有以下方案的表:(请注意“帖子编号”列)

-- UserID  -- Post Id  -- Post Number*

-- 4       -- 85       -- 1
-- 4       -- 86       -- 2
....
-- 5       -- 9362     -- 1
-- 4       -- 9363     -- 3

有没有一种方法可以独立于所有其他条目自动递增列,并且仅尊重具有相同主键的那些列?如果是这样,有人将如何实施呢?

非常感谢。


阅读 141

收藏
2021-05-16

共1个答案

一尘不染

为了实现所需的功能,您必须使用Triggers。没有其他直接方法可以完成此任务(我想)。

我确实尝试了一个快速演示:

Create Table SoQuestion (
  UserId int,
  PostId int,
  PostNumber int null
 );

 CREATE TRIGGER inc_post_num 
 BEFORE INSERT ON SoQuestion
 FOR EACH ROW
 set New.PostNumber = (select num 
                       From (select count(*) as num 
                             from SoQuestion 
                             where UserId = New.UserId) as b) 
                     + 1;


insert into SoQuestion (UserId, PostId) Values (1,1);
insert into SoQuestion (UserId, PostId) Values (1,10);
insert into SoQuestion (UserId, PostId) Values (1,20);
insert into SoQuestion (UserId, PostId) Values (2,1);
insert into SoQuestion (UserId, PostId) Values (2,10);
insert into SoQuestion (UserId, PostId) Values (3,1);
insert into SoQuestion (UserId, PostId) Values (4,1);

select * FROM SoQuestion;

这是我得到的输出:

UserId | PostId | PostNumber |
==============================  
1      | 1      | 1          |
1      | 10     | 2          |
1      | 20     | 3          |
2      | 1      | 1          |
2      | 10     | 2          |
3      | 1      | 1          |
4      | 1      | 1          |

这是演示


浏览完Auto_Increment文档后,我找到了另一种无需使用触发器即可实现此目的的方法。这个想法是关于创建一个Auto_Increment列,并添加另一个列为PRIMARY KEY。在我们的情况下,它将是UserIdAUTO_INCREMENT将会是PostNumber主键。这是这样的:

Create Table SoQuestion (
  UserId int,
  PostId int,
  PostNumber int NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (UserId, PostNumber)
 );

insert into SoQuestion (UserId, PostId) Values (1,1);
insert into SoQuestion (UserId, PostId) Values (1,10);
insert into SoQuestion (UserId, PostId) Values (1,20);
insert into SoQuestion (UserId, PostId) Values (2,1);
insert into SoQuestion (UserId, PostId) Values (2,10);
insert into SoQuestion (UserId, PostId) Values (3,1);
insert into SoQuestion (UserId, PostId) Values (4,1);

select * FROM SoQuestion;

这将为我们提供与第一种方法相同的输出:

UserId | PostId | PostNumber |
==============================  
1      | 1      | 1          |
1      | 10     | 2          |
1      | 20     | 3          |
2      | 1      | 1          |
2      | 10     | 2          |
3      | 1      | 1          |
4      | 1      | 1          |

这是第二种方式的演示

2021-05-16