sql >> Database teknologi >  >> RDS >> Mysql

Mysql øger automatisk en kolonne med én specifik primærnøgle

For at opnå det, du leder efter, skal du bruge triggere . Der er ingen anden direkte måde at udføre denne opgave på (gætte).

Jeg prøvede en hurtig demo 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;

Og her er det output, jeg fik:

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

Her er demoen .

Efter at have gennemgået Auto_Increment dokumentation, fandt jeg en anden måde at opnå dette på uden at bruge triggere. Ideen handler om at skabe en Auto_Increment kolonne og tilføje den med en anden kolonne som PRIMARY KEY . I vores tilfælde ville det være UserId og AUTO_INCREMENT ville være PostNumber og de danner begge den primære nøgle. Sådan er det:

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;

Dette ville give os det samme output, som den første måde gav:

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

Og her er demoen for den anden vej.



  1. Værktøj til scripting af tabeldata

  2. Fjern efterfølgende nuller i decimalværdi med skiftende længde

  3. Får ikke korrekt COUNT() i MySQL-forespørgsel (modificeret tidligere)

  4. Databasemodellering:Hvordan kategoriserer man produkter som Amazon?