Mysql使用一个特定的主键自动递增列
假设我有一张具有以下方案的表: (注意邮政编码栏) 是否有一种方法可以独立于所有其他条目自动递增一列,并且只尊重具有相同主键的条目?如果是的话,有人会如何实现这一点Mysql使用一个特定的主键自动递增列,mysql,sql,mariadb,Mysql,Sql,Mariadb,假设我有一张具有以下方案的表: (注意邮政编码栏) 是否有一种方法可以独立于所有其他条目自动递增一列,并且只尊重具有相同主键的条目?如果是的话,有人会如何实现这一点 非常感谢。为了实现您想要的目标,您必须使用。没有其他直接的方法来完成这个任务(我想) 我现在确实尝试了一个快速演示: Create Table SoQuestion ( UserId int, PostId int, PostNumber int null ); CREATE TRIGGER inc_post_nu
非常感谢。为了实现您想要的目标,您必须使用。没有其他直接的方法来完成这个任务(我想) 我现在确实尝试了一个快速演示:
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 |
这是我的建议
在阅读了文档之后,我找到了另一种不用触发器就能实现这一点的方法。其思想是创建一个
自动增量
列,并将其与另一列一起添加为主键
。在我们的例子中,它将是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 |
第二种方法是这样的。为了实现你想要的,你必须使用。没有其他直接的方法来完成这个任务(我想)
SET New.PostId := IFNULL(
( SELECT MAX(PostId)+1
FROM SoQuestion
WHERE UserId = New.UserId ), 1);
我现在确实尝试了一个快速演示:
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 |
这是我的建议
在阅读了文档之后,我找到了另一种不用触发器就能实现这一点的方法。其思想是创建一个
自动增量
列,并将其与另一列一起添加为主键
。在我们的例子中,它将是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 |
这是第二条路的路线
SET New.PostId := IFNULL(
( SELECT MAX(PostId)+1
FROM SoQuestion
WHERE UserId = New.UserId ), 1);
这应该可以避免DELETE
与COUNT(*)
混淆的错误
这应该可以避免
DELETE
与COUNT(*)
的错误。你的意思是自动增加帖子号?我猜OP希望根据UserId列增加帖子号。所以基本上每个用户ID都有自己的PostNumber@PaulKaram是的,这正是我需要的。你的意思是自动增加帖子号?我猜OP想根据UserId列增加帖子号。所以基本上每个用户ID都有自己的PostNumber@Paul是的,这正是我需要的,你救了我。非常感谢,小虫。。。如果删除一行COUNT(*)
会导致问题。而是使用MAX(PostId)
。但是,如果还没有条目的话,事情就会变得一团糟。你救了我。非常感谢,小虫。。。如果删除一行COUNT(*)
会导致问题。而是使用MAX(PostId)
。但是,如果还没有条目,它就会变得混乱。