sql >> Databasteknik >  >> RDS >> Mysql

Mysql ökar automatiskt en kolumn med en specifik primärnyckel

För att uppnå det du letar efter måste du använda utlösare . Det finns inget annat direkt sätt att utföra denna uppgift (tror jag).

Jag provade en snabb 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;

Och här är resultatet som jag fick:

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

Här är demon .

Efter att ha gått igenom Auto_Increment dokumentation, hittade jag ett annat sätt att uppnå detta utan att använda triggers. Tanken handlar om att skapa en Auto_Increment kolumn och lägg till den med en annan kolumn som PRIMARY KEY . I vårt fall skulle det vara UserId och AUTO_INCREMENT skulle vara PostNumber och de bildar båda den primära nyckeln. Så här:

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;

Detta skulle ge oss samma utdata som det första sättet 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          |

Och här är demon för det andra sättet.



  1. Hur man byter ut en del av en sträng i T-SQL

  2. PHP/PDO:Förberedda uttalanden fungerar inte när man skapar en tabell?

  3. Välja Max- och Min-posterna i ett MySQL-kommando

  4. Vilken DB för stora databaser?