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

トリガーがテーブルを認識しない(NEW.valuesのコンテンツを複数の行に分割して別のテーブルに挿入するトリガー)

    文字列を分割しようとしている場合は、このように1と2をハードコーディングできます。現在、このテーブルには1と2が含まれるようにハードコーディングされているため、数値テーブルで1と2を取得する必要はありません。

    SET @V = SUBSTRING_INDEX(SUBSTRING_INDEX(new.Vu, ' ', 1), ' ', -1),
        @U = SUBSTRING_INDEX(SUBSTRING_INDEX(new.Vu, ' ', 2), ' ', -1);
    

    sqlfiddle

    しかし、SUBSTRING_INDEX()を2回呼び出す必要がないことに気づきました。これも機能します

        SET @V = SUBSTRING_INDEX(new.Vu, ' ', 1),
            @U = SUBSTRING_INDEX(new.Vu,' ', -1);
    

    sqlfiddle

    更新 コメントを見た後、なぜテーブルnumbersを作成したかがわかります したがって、トリガーは次のようになります。最初にテーブルnumbersを作成します。 1から10までのn個の値(行に分割できるフィールドの最大数)を含む行が含まれています。次に、numbersから選択します。 ここで、n個の値は<=数値のフィールド数です。次に、SUBSTRING_INDEX()関数を適用して、n位置のフィールドを取得します。

    create table numbers 
    select 1 as n 
    union select 2 
    union select 3
    union select 4
    union select 5
    union select 6
    union select 7
    union select 8
    union select 9
    union select 10;
    
    CREATE TRIGGER `edit2` AFTER INSERT 
    ON `table1` 
    FOR EACH ROW BEGIN 
    
        INSERT INTO table2 (number,player,team,position)
        SELECT 
        SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.number,' ',n),' ',-1) as number,
        NEW.player as player,
        SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.team,', ',n),', ',-1) as team,
        SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.position,' ',n),' ',-1) as position
        FROM
        numbers n
        WHERE LENGTH(NEW.number)
                 - LENGTH(REPLACE(NEW.number,' ',''))
                 + 1 >= n.n;
    
    END
    

    sqlfiddleでトリガーの動作を確認




    1. Doctrine2でテーブルタイプ/ストレージエンジンを指定します

    2. MySQLの行を読み取り専用に設定するにはどうすればよいですか?

    3. PostgreSQLのAVG()関数

    4. MariaDBコンポジットの日付と時刻の単位の説明