sql >> Databáze >  >> RDS >> Mysql

Mysql automaticky zvýší sloupec s jedním konkrétním primárním klíčem

Abyste dosáhli toho, co hledáte, musíte použít spouštěče . Neexistuje žádný jiný přímý způsob, jak tento úkol splnit (myslím).

Teď jsem zkusil rychlé 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 tady je výstup, který jsem dostal:

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

Zde je ukázka .

Po procházení Auto_Increment dokumentaci, našel jsem jiný způsob, jak toho dosáhnout bez použití spouštěčů. Myšlenka je o vytvoření Auto_Increment a přidejte jej s dalším sloupcem jako PRIMARY KEY . V našem případě by to bylo UserId a AUTO_INCREMENT by bylo PostNumber a oba tvoří primární klíč. Takto:

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 by nám poskytlo stejný výstup jako první způsob:

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 zde je ukázka pro druhý způsob.



  1. Kontrola chyb u připravených výpisů CHOP

  2. vytvoření přihlašovací stránky pomocí PHP

  3. Při použití pythonu a mysql nebyly v příkazu SQL použity všechny parametry

  4. Jak změnit formát data v databázi Oracle