MySQLでよく踏む穴

12412 ワード

MySQLがよく踏む穴【updating...】
1.問題1
今日、SQLのセットを実行するときに、「逆天」ではないエラーが発生しました.データベースのデータ**が「理由なし」**に失われました.もう少しで会社に取り返しのつかない損失をもたらすところだった!
2.SQLプロセス
  • dim_shopのデータ
  • を参照
    mysql> select count(*) from dim_shop;
    +----------+
    | count(*) |
    +----------+
    |        2 |
    +----------+
    1 row in set (0.00 sec)
    
  • テーブルdim_shop_2
  • を作成
    mysql> create table dim_shop_2
        -> select
        -> max(shop_key)
        -> from dim_shop;
    Query OK, 1 row affected (0.23 sec)
    Records: 1  Duplicates: 0  Warnings: 0
    

    注意テンポラリ・テーブルのSQLを作成します.dim_が見えますshop_2には1つのデータしかありません.次のSQLを実行します.
    mysql> delete from dim_shop
        -> where shop_key in (select shop_key from dim_shop_2);
    Query OK, 2 rows affected (0.11 sec)
    

    最後にdim_を表示shopテーブルのデータは、0本発見!
    mysql> select count(*) from dim_shop;
    +----------+
    | count(*) |
    +----------+
    |        0 |
    +----------+
    1 row in set (0.00 sec)
    

    いったい何がdim_shopのデータが0件になったのだろうか.主な原因は以下の通りです.
    3.原因
    dim_shop_2を作成したSQLは次のとおりです.
    create table dim_shop_2
    select
    max(shop_key)
    from dim_shop_temp;
    

    ここのmax(shop_key)に注意してください.別名は使用されていません.結果は次のようになります.
    mysql> select * from dim_shop_2;
    +---------------+
    | max(shop_key) |
    +---------------+
    |            22 |
    +---------------+
    1 row in set (0.00 sec)
    

    結果として出たテーブルフィールドはmax(shop_key)です.shop_keyではありませんしたがって、削除文を実行するときは、次のようになります.
    delete from dim_shop
    where shop_key in (select shop_key from dim_shop_2);
    
    where以降の文をtrueとしたため、dim_shop中のデータは全て削除された.以下のSQLを個別に実行
    mysql> select shop_key from dim_shop_2;
    ERROR 1054 (42S22): Unknown column 'shop_key' in 'field list'
    

    エラーを報告しますがmysqlはこのエラーを無視します.それをtrueに翻訳し、テーブル全体のデータを直接削除します.
    2.問題2
    一般的なgroupby操作では、いくつかの問題が発生します.group byに従ってフィールドに対応するロー値を直接取得することはできません.これは問題がある可能性があります.次のようになります.
    mysql> select start_date,end_date,max(shop_key) from dim_shop_2 group by shop_id;
    +---------------------+---------------------+---------------+
    | start_date          | end_date            | max(shop_key) |
    +---------------------+---------------------+---------------+
    | 2017-05-24 13:11:58 | 2018-10-26 21:00:45 |             5 |
    +---------------------+---------------------+---------------+
    1 row in set (0.00 sec)
    

    私たちはshopを取りたいです.key=5行の値ですが、start_date end_dateは次のSQLとは異なります.
    mysql> select start_date,end_date, shop_key from dim_shop_2 where shop_key = 5;
    +---------------------+---------------------+----------+
    | start_date          | end_date            | shop_key |
    +---------------------+---------------------+----------+
    | 2018-11-02 20:09:37 | 9999-12-31 00:00:00 |        5 |
    +---------------------+---------------------+----------+
    1 rows in set (0.00 sec)
    

    すなわち、group byが取得したmax(shop_key)からmax(shop_key)の対応行のデータを取得することはできない.