sql >> Database >  >> RDS >> Mysql

Mysql verhoogt automatisch een kolom met één specifieke primaire sleutel

Om te bereiken wat u zoekt, moet u triggers . Er is geen andere directe manier om deze taak te volbrengen (denk ik).

Ik heb nu een snelle demo geprobeerd:

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;

En hier is de output die ik heb:

UserId | PostId | PostNumber |
==============================  
1      | 1      | 1          |
1      | 10     | 2          |
1      | 20     | 3          |
2      | 1      | 1          |
2      | 10     | 2          |
3      | 1      | 1          |
4      | 1      | 1          |

Hier is de demo .

Na het doorlopen van de Auto_Increment documentatie, heb ik een andere manier gevonden om dit te bereiken zonder triggers te gebruiken. Het idee gaat over het maken van een Auto_Increment kolom en voeg deze toe met een andere kolom als PRIMARY KEY . In ons geval zou het UserId . zijn en de AUTO_INCREMENT zou zijn PostNumber en ze vormen allebei de primaire sleutel. Dit is hoe:

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;

Dit zou ons dezelfde output geven als de eerste manier:

UserId | PostId | PostNumber |
==============================  
1      | 1      | 1          |
1      | 10     | 2          |
1      | 20     | 3          |
2      | 1      | 1          |
2      | 10     | 2          |
3      | 1      | 1          |
4      | 1      | 1          |

En hier is de demo voor de tweede manier.



  1. Hoe PII te vinden en te maskeren in Elasticsearch

  2. H2 postgresql-modus lijkt niet te werken voor mij

  3. Een sql-query herformuleren

  4. Hoe WEIGHT_STRING() werkt in MariaDB