Let's say I have a table with following scheme: (Note the Post Number column)
-- UserID -- Post Id -- Post Number*
-- 4 -- 85 -- 1
-- 4 -- 86 -- 2
....
-- 5 -- 9362 -- 1
-- 4 -- 9363 -- 3
Is there a way to auto_increment a column independently from all other entries and only respect those with the same primary key? If so, how would someone implement this?
Thanks a lot.
SET New.PostId := IFNULL(
( SELECT MAX(PostId)+1
FROM SoQuestion
WHERE UserId = New.UserId ), 1);
This should avoid the bug wherein a DELETE
messes with COUNT(*)
.
In order to achieve what you're looking for, you have to use triggers . There's no other direct way to accomplish this task (I guess).
I did try a fast demo now:
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;
And here's the output that I got:
UserId | PostId | PostNumber |
==============================
1 | 1 | 1 |
1 | 10 | 2 |
1 | 20 | 3 |
2 | 1 | 1 |
2 | 10 | 2 |
3 | 1 | 1 |
4 | 1 | 1 |
Here's the demo .
After going through the Auto_Increment documentation, I found another way to achieve this without using triggers. The idea is about creating an Auto_Increment
column and add it with another column as PRIMARY KEY
. In our case it would be UserId
and the AUTO_INCREMENT
would be PostNumber
and they both form the primary key. This is how:
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;
This would give us the same output that the first way gave:
UserId | PostId | PostNumber |
==============================
1 | 1 | 1 |
1 | 10 | 2 |
1 | 20 | 3 |
2 | 1 | 1 |
2 | 10 | 2 |
3 | 1 | 1 |
4 | 1 | 1 |
And here's the demo for the second way.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.