假设我有一个包含以下方案的表格: (注意帖子编号栏)
-- UserID -- Post Id -- Post Number*
-- 4 -- 85 -- 1
-- 4 -- 86 -- 2
....
-- 5 -- 9362 -- 1
-- 4 -- 9363 -- 3
是否有办法独立于所有其他条目自动增加列,并且只考虑具有相同主键的列?如果是这样,有人会如何实现这个?
非常感谢。
答案 0 :(得分:2)
SET New.PostId := IFNULL(
( SELECT MAX(PostId)+1
FROM SoQuestion
WHERE UserId = New.UserId ), 1);
这应避免DELETE
与COUNT(*)
混淆的错误。
答案 1 :(得分: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 |
这是demo。
在浏览了Auto_Increment文档之后,我找到了另一种不使用触发器来实现此目的的方法。我们的想法是创建Auto_Increment
列,并将其添加为另一列PRIMARY KEY
。在我们的例子中,它将是UserId
而AUTO_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 |
这是第二种方式的demo。