Mysql
 sql >> база данни >  >> RDS >> Mysql

Mysql автоматично увеличава колона с един конкретен първичен ключ

За да постигнете това, което търсите, трябва да използвате задействания . Няма друг директен начин за изпълнение на тази задача (предполагам).

Опитах бърза демонстрация сега:

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          |

Ето демото .

След преминаване през Auto_Increment документация, намерих друг начин да постигна това, без да използвам тригери. Идеята е за създаване на Auto_Increment колона и я добавете с друга колона като PRIMARY KEY . В нашия случай това би било 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          |

А ето и демото за втория начин.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Името на таблицата е посочено два пъти като цел за актуализиране и като отделен източник за данни

  2. Как да заменя всеки друг екземпляр на конкретен символ в MySQL низ?

  3. Не мога да използвам mysql_* функции след надграждане на PHP

  4. Изберете от една таблица, където не в друга

  5. Грешка десетичната точност на MySQL и PHP