MySQLでよく踏む穴
12412 ワード
MySQLがよく踏む穴【updating...】
1.問題1
今日、SQLのセットを実行するときに、「逆天」ではないエラーが発生しました.データベースのデータ**が「理由なし」**に失われました.もう少しで会社に取り返しのつかない損失をもたらすところだった!
2.SQLプロセス表 を参照テーブル を作成
注意テンポラリ・テーブルのSQLを作成します.dim_が見えますshop_2には1つのデータしかありません.次のSQLを実行します.
最後にdim_を表示shopテーブルのデータは、0本発見!
いったい何が
3.原因
表
ここの
結果として出たテーブルフィールドは
エラーを報告しますがmysqlはこのエラーを無視します.それをtrueに翻訳し、テーブル全体のデータを直接削除します.
2.問題2
一般的なgroupby操作では、いくつかの問題が発生します.
私たちはshopを取りたいです.key=5行の値ですが、
すなわち、
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)
の対応行のデータを取得することはできない.