Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql使用一个特定的主键自动递增列_Mysql_Sql_Mariadb - Fatal编程技术网

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)
。但是,如果还没有条目,它就会变得混乱。