MySQL アップデート

《Mysql 5.6 から 5.7 アップグレードの事前確認》
○変更点1  以下三つデフォルトのSQLモード(sql_mode)の変更(デフォルトで有効になる。)

1.STRICT_TRANS_TABLES
2.ONLY_FULL_GROUP_BY
3.NO_ENGINE_SUBSTITUTION

1.STRICT_TRANS_TABLES  ※影響あり
5.6ではNot nullableカラムに対して無効or欠落になるようなINSERT,UPDATE文が実行された時に「勝手に桁を切り詰めたり」「勝手に文字列を数値にキャスト」するなど(警告は出る)して動的に暗黙の型変換を行なっていた。。
→有効になるとエラーになり、実行処理時にエラー吐かれる。

/*
name varchar 5 not null 
email varchar 255 not null 
verified_at timestamp not null 
*/

INSERT users(name, email, verified_at).  VALUES('hirohiro', 'email@gmail.com', '')

/*
 nameは 'hiroh' の5文字に切り詰め
 verified_atは'0000-00-00 00:00:00'に変換されてしまう
*/

MySQL 5.7.4 から 5.7.7 まで、STRICT_TRANS_TABLES は ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE, NO_ZERO_IN_DATE モードの影響を含んでいます。■ERROR_FOR_DIVISION_BY_ZERO
・このモードが有効でない場合、ゼロによる除算はNULLを挿入し、警告を発生させません。
・このモードが有効な場合、ゼロによる除算はNULLを挿入し、警告を発生させます。
・SELECTでは、ゼロによる除算はNULLを返します。ERROR_FOR_DIVISION_BY_ZERO を有効にすると、厳密モードが有効であるかどうかにかかわらず、警告も生成されるようになります。■NO_ZERO_DATE(0000-00-00許可)
・このモードが有効でない場合、’0000-00-00’は許可され、挿入時に警告は発生しません。
・このモードが有効な場合、’0000-00-00′ は許可され、挿入時に警告が発生する。
・このモードとstrictモードが有効な場合、’0000-00-00’は許可されず、IGNOREが指定されない限り、挿入はエラーになる。INSERT IGNOREとUPDATE IGNOREの場合、’0000-00-00’は許可され、挿入すると警告が発生する。■NO_ZERO_IN_DATE(2010-01-00許可)
・このモードが有効でない場合、ゼロの部分を持つ日付は許可され、挿入時に警告は発生しません。
・このモードが有効な場合、ゼロの部分を持つ日付は’0000-00-00’として挿入され、警告を発生させます。
・このモードと厳密モードが有効な場合、IGNOREが指定されない限り、ゼロの部分を持つ日付は許可されず、挿入はエラーになる。INSERT IGNOREとUPDATE IGNOREの場合、ゼロの部分を持つ日付は’0000-00-00’として挿入され、警告が発生します。2.ONLY_FULL_GROUP_BY  ※影響強め
ONLY_FULL_GROUP_BYを有効にすると、 HAVING 条件、または ORDER BY リストが、
GROUP BY 句で指定されていない、または GROUP BY 列に機能的に依存していない(一意に決まる)非集約列を参照しているクエリを拒否する(whereは機能的に依存(whereで絞った後にGROUP BYが実行されるため??))。
◎シンプルに言うとSELECTの非集約カラムをGROUP BYに指定しないとエラー
→備考: WHEREで指定しているときはGROUPBYに指定なくてもOK(エラー出ない)
◎併用パターン:ORDER BYと併用するときはGROUP BYで指定しているカラム以外を指定するとエラー出る。
→備考: 併用パターンでもWHEREで指定しているときはGROUPBYに指定なくてもOK(エラー出ない)通常覚え方:SELECTカラム = (WHEREカラム+GRPUP BYカラム)
                         →SELECT カラムを全て満たしてれば、GROUP BY カラム増えてもOK
併用覚え方:ORDER BYカラム IN( WHEREカラム + GRPUP BYカラム)
                         →ORDER BYはGROUP BY列に機能的に依存しているカラム(where)
                             をしてするのはOK

例.
  SELECT sum(presence.presence_status = 1) as attendance,
         sum(presence.presence_status = 2) as absence,
         sum(presence.presence_status = 3) as tardy,
         sum(presence.presence_status = 4) as early_withdrawal,
         sum(presence.presence_status = 5) as attendance5,
         sum(presence.presence_status = 6) as attendance6,
         presence_date,
         presence_time,
         group_id
    FROM presence
   WHERE school_id = 2
     AND presence_date = '2019-02-02'
     AND group_id = 1
     AND year = 2022
     AND active = 1
GROUP BY group_id, presence_time
ORDER BY group_id ASC, presence_date ASC;

3.NO_ENGINE_SUBSTITUTION
NO_ENGINE_SUBSTITUTIONを無効にすると、CREATE TABLEではデフォルトエンジンが使用され、希望のエンジンが使用できない場合は警告が発生(ALTER TABLEでは、警告が発生し、テーブルは変更されません)。
NO_ENGINE_SUBSTITUTIONを有効にすると、希望するエンジンが利用できない場合、エラーが発生し、テーブルの作成も変更も行われない。○注意点2日時カラムの内部構造変換に伴い、移行に時間がかかる可能性がある
MySQL バージョン 5.6.4 では、datetimetimetimestamp 列で、日付と時刻の値に小数部を使用できる新しい日付と時刻の形式が導入されました。DB インスタンスを MySQL バージョン 5.7 にアップグレードすると、MySQL はすべての日付と時刻の列のタイプを新しい形式に強制的に変換します。
ALTER TABLE <table_name> FORCE;コマンドでデータ型を先に変更しておくとよい。《MySQL 5.7 から 8.0 へのアップグレードの事前確認》
・SQLモード(sql_mode=’NO_AUTO_CREATE_USER’)の廃止
 → 存在しないユーザに対するGRANT文を実行した時にユーザが自動作成されることを禁止できました。
・マイクロ秒非対応のTIME、DATETIME、および TIMESTAMPは8.0で廃止
 →MySQL5.7にアップグレードした後、 mysql_upgrade を実行することで新形式の日付・時刻型に修正されるため、順当にバージョンアップしている場合は問題にならない
・GROUP BY 〜 DESCの廃止 (編集済み) QiitaQiita【Aurora】Mysql5.6から5.7へのバージョンアップについて – Qiita

■GROUP BY(ONLY_FULL_GROUP_BY)
◎シンプルに言うとSELECTの非集約カラムをGROUP BYに指定しないとエラー
→備考: SELECTの非集約カラムをWHEREで指定しているときはGROUPBYに指定なくてもOK
→備考: 以上を満たしていれば、GROUP BYのカラムは増えてもOK
◎併用パターン:ORDER BYと併用するときはGROUP BYで指定しているカラム以外を指定するとエラー出る。
→備考: 併用パターンでもWHEREで指定しているときはGROUPBYに指定なくてもOK(【まとめ】
通常覚え方:SELECTカラム = (WHEREカラム+GRPUP BYカラム)
                         →SELECT カラムを全て満たしてれば、GROUP BY カラム増えてもOK
併用覚え方:ORDER BYカラム IN( WHEREカラム + GRPUP BYカラム)
                         →ORDER BYはGROUP BY列に機能的に依存しているカラム(where)
                             をしてするのはOK
例↓(SELECTとORDER BYが後で実行されるからなのかな?????)

  SELECT sum(presence.presence_status = 1) as attendance,
         presence_date,
         presence_time,
         short_hr1,
         group_id
    FROM presence
   WHERE school_id = 2
     AND presence_date = '2019-02-02'
     AND group_id = 1
     AND short_hr1 = 1
     AND year = 2022
     AND active = 1
GROUP BY group_id, presence_time, year
ORDER BY group_id ASC, presence_date ASC;

ストレージエンジン特徴             

  • MyISAM        データファイルとインデックスファイルの2ファイルで保存される。トランザクション、行レベルのロックをサポートしていない。→テーブルロックをかけるので、複数のクライアントからの同時更新でロックが発生する
  • InnoDB        トランザクション、行レベルに対応したエンジン。MyISAMよりは速度が劣る。
  • Memory        メモリにデータを格納するエンジン。再起動などで、データが失われる。
  • Merge        複数のMyISAMを統合したエンジン。
  • Federated      ローカルにデータを保存せず、リモートを参照するエンジン。


https://zenn.dev/sasumasa/articles/c22398d1128162

SQL文

ALTER
|  1  |      2       |     3    |       4       |      5      |
カラム  型(+ unsigned)(NOT NULL) DEFAULT 'hoge'  COMMNET 'hoge'

CREATE文

CREATE TABLE `specialneeds_education`
(
    `id`            int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '登録ID',
    `school_id`     int(11) NOT NULL COMMENT '学校ID',
    `student_id`    int(11) NOT NULL COMMENT '生徒ID',
    `type_id`       int(11) NOT NULL COMMENT '生徒分類ID',
    `target_date`   date      NOT NULL COMMENT '来室日',
    `from_time`     varchar(5)         DEFAULT NULL COMMENT '来室時間(00:00)',
    `to_time`       varchar(5)         DEFAULT NULL COMMENT '退室時間(00:00)',
    `other_time`    int(11) NOT NULL DEFAULT '0' COMMENT 'presence_timeが0の時、1:朝のSHR、2:帰りのSHR、3:昼休み、4:放課後\r\npresence_timeが0以外の時は、0',
    `presence_time` int(11) NOT NULL DEFAULT '0' COMMENT '時限',
    `note`          text COMMENT '備考欄',
    `year`          int(11) DEFAULT NULL COMMENT '年度',
    `active`        tinyint(1) NOT NULL DEFAULT '1' COMMENT '有効/無効',
    `created_at`    timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '作成日時',
    `created`       int(11) NOT NULL COMMENT '作成者',
    `updated_at`    timestamp NULL DEFAULT NULL COMMENT '更新日時',
    `updated`       int(11) DEFAULT NULL COMMENT '更新者',
    PRIMARY KEY (`id`),
    KEY             `school_id` (`school_id`),
    KEY             `student_id` (`student_id`),
    KEY             `type_id` (`type_id`),
    KEY             `target_date` (`target_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='特別支援教室利用状況登録内容';

ALTER文
カラム追加

ALTER TABLE
 school_report_subject_replace 
add column
 year date default null comment '年度' after active;
ALTER TABLE
 school_report_subject_replace_setting
ADD COLUMN
 created_at timestamp default not null comment '登録日時' after report_type;

ALTER TABLE
 grade_extract_conf
ADD COLUMN
 hr_grade TINYINT(1)  NOT NULL COMMENT '期間指定(学年)' AFTER period_id;
ALTER TABLE
 school_report_subject_replace_setting
ADD COLUMN
 created int(11) not null  comment '登録者' after created_at;
ALTER TABLE
  admission_enrollment_menu 
ADD COLUMN
  show_answer_flg TINYINT(1)
  NOT NULL DEFAULT 0  comment '合格者一覧画面に回答を表示するか'
AFTER show_in_accepted_list_flg;

変更系

ALTER TABLE `school_report_subject_replace` modify ss_name varchar(50);

curlコマンド

curlコマンド
様々な通信プロトコルでデータの送受信を行うことができるコマンド
-S はエラー表示する
-s は通常出力される進捗状況表示、(エラーメッセージ表示を抑制する)、
-sS で通常の進捗状況を非表示にして、エラーメッセージを表示するというオプションです。-i ならば、Response Header, Body 両方を出力できます。

コメント

タイトルとURLをコピーしました