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

SQLは計算列を更新します

    問題は、marktwertを計算しないことです。 31歳以上のプレーヤー(Spieler)の値(geburtstag =誕生日)。 UPDATEステートメントがNULLを書き込もうとしています marktwertNOT NULLとして定義されている列 。その結果、エラーが発生します。

    ソリューション:

    1)ユーザーELSE CASEで ステートメントを作成し、デフォルト値を設定します:

    UPDATE _spieler SET marktwert =     CASE 
            WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 27 THEN ((w_staerke/100*70) + (w_technik/100*30))
            WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 31 THEN ((w_staerke/100*70) + (w_technik/100*30))
            ELSE 0
        END;
    

    2)NULLを許可する 列marktwertの値 :

    CREATE TABLE `_spieler` (
      ...
      `marktwert` int(10) NULL DEFAULT '0',
      ...
    )
    

    3)WHEREを使用します 状態:

    UPDATE _spieler SET marktwert =     CASE 
            WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 27 THEN ((w_staerke/100*70) + (w_technik/100*30))
            WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 31 THEN ((w_staerke/100*70) + (w_technik/100*30))
        END
    WHERE TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 31;
    

    更新:marktwertを削除することもできます 列を作成し、ビュー を使用します (計算された表)代わりに:

    CREATE VIEW `_spieler_view` AS SELECT s.*,
        CASE 
            WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 27 THEN ((w_staerke/100*70) + (w_technik/100*30))
            WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 31 THEN ((w_staerke/100*70) + (w_technik/100*30))
        END AS marktwert_calculated
    from _spieler s ;
    

    アップデート2:

    MariaDBを使用する場合は、仮想(計算)列>




    1. クエリログを有効にした後のログファイルはどこにありますか?

    2. フラットファイルでMySQLを使用するのはなぜですか?

    3. Genymotionエミュレーターがホストが使用しているWIFIインターネットを使用できるようにする方法

    4. php/mysqlの郵便番号近接検索