Mysql使用一个特定主键自动增加列

时间:2018-02-09 18:02:57

标签: mysql sql mariadb

假设我有一个包含以下方案的表格: (注意帖子编号栏)

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

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

是否有办法独立于所有其他条目自动增加列,并且只考虑具有相同主键的列?如果是这样,有人会如何实现这个?

非常感谢。

2 个答案:

答案 0 :(得分:2)

SET New.PostId := IFNULL(
      ( SELECT  MAX(PostId)+1
            FROM  SoQuestion
            WHERE  UserId = New.UserId ), 1);

这应避免DELETECOUNT(*)混淆的错误。

答案 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。在我们的例子中,它将是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          |

这是第二种方式的demo