sql >> データベース >  >> RDS >> Mysql

Mysqlは、1つの特定の主キーで列を自動インクリメントします

    探しているものを実現するには、トリガー 。このタスクを実行する他の直接的な方法はありません(私は推測します)。

    私は今、速いデモを試しました:

    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          |
    

    そして、これがデモ です。 2番目の方法です。



    1. CSSスタイリングをPHP出力に適用する

    2. SQLServerでの監査トリガーの作成

    3. MySQLインジェクション-SELECTクエリを使用して更新/削除します

    4. MySQLのフィールドから最初の明確な一致のみを選択するにはどうすればよいですか?