Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Mysql automatycznie zwiększa kolumnę o jeden określony klucz podstawowy

Aby osiągnąć to, czego szukasz, musisz użyć wyzwalacze . Nie ma innego bezpośredniego sposobu na wykonanie tego zadania (chyba).

Wypróbowałem teraz szybkie demo:

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;

A oto wynik, który otrzymałem:

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

Oto demo .

Po przejściu przez Auto_Increment dokumentacji, znalazłem inny sposób na osiągnięcie tego bez użycia wyzwalaczy. Pomysł polega na stworzeniu Auto_Increment kolumnę i dodaj ją z inną kolumną jako PRIMARY KEY . W naszym przypadku byłby to UserId i AUTO_INCREMENT byłby PostNumber i oba tworzą klucz podstawowy. Oto jak:

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;

To dałoby nam ten sam wynik, co pierwszy sposób:

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

A oto demo na drugi sposób.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ostrzeżenie:mysqli_error() oczekuje dokładnie 1 parametru, podano 0

  2. Wygląda na to, że aplikacja internetowa [] uruchomiła wątek o nazwie [Wątek czyszczenia porzuconego połączenia] com.mysql.jdbc.AbandonedConnectionCleanupThread

  3. Niezdefiniowany indeks:REMOTE_ADDR podczas migracji Laravel

  4. MySQL, wybierz rekordy na podstawie wartości w tablicy JSON

  5. Wstrzyknięcia SQL w ADOdb i ogólne bezpieczeństwo witryny