MW211 EXIT

devlog
MySQL8/ログインできない
2019年02月01日
MySQL8だとパスワードの暗号方式が変わったため
(rootでも)phpMyAdminからログインできなくなってしまっている。

で、その対処方法。

(1) コマンドライン(「MySQL 8.0 Command Line Client」)でログインする
    (こちらはrootユーザのパスワードでログインする(ログインできる))

(2) 以下SQL文にて、ユーザの登録状況を確認する
    ┌──────────────────────────────────┐
    │SELECT `user`,                                                      │
    │       `host`,                                                      │
    │       `plugin`                                                     │
    │    FROM `mysql`.`user`;                                            │
    └──────────────────────────────────┘
    すると`plugin`が「caching_sha2_password」(新しい形式のパスワード)に
    なっているので、これを古い形式のパスワード(mysql_native_password)に変更する
    以下SQL文を実行する
    ┌──────────────────────────────────┐
    │ALTER USER 'root'@'localhost'                                       │
    │    IDENTIFIED WITH mysql_native_password                           │
    │               BY 'パスワード';                                     │
    └──────────────────────────────────┘
    「パスワード」の部分はそれまでのパスワード(新しくてもよい)に読み替えのこと
    これでDB側はOK

(3) MySQLの設定ファイル「my.ini」の中身を変更する
    このファイルは以下の配下あたりにある(隠しフォルダなので注意)
    ┌──────────────────────────────────┐
    │C:\ProgramData\MySQL\MySQL Server 8.0                               │
    └──────────────────────────────────┘
    そして、その中身を以下のように書き換える
    ┌───┬──────────────────────────────┐
    │変更前│default_authentication_plugin=caching_sha2_password         │
    ├───┼──────────────────────────────┤
    │変更後│default_authentication_plugin=mysql_native_password         │
    └───┴──────────────────────────────┘
    なお、当該ファイルは管理者権限で書き換える必要があるので注意
    →メモ帳を管理者権限で開き、当該ファイルを読み込んで更新する形が確実
    後は、MySQLを再起動すればOK
分類:MySQL
MySQL/更新時における自身のサブクエリ
2017年07月29日
例えば、並び順を末尾に追加したい場合、現状の最大値+1を更新するようにするとする。

ただ、以下だとエラー(1093エラー)となる。
┌──────────────────────────────────────┐
│INSERT INTO `表`                                                            │
│    SET `列` = 値,                                                          │
│        `順` = (SELECT MAX(`順`) + 1                                        │
│                    FROM `表`);                                             │
└──────────────────────────────────────┘

サブクエリに自らの表を使用できないのが原因だ。
この場合、以下のように別表にしてしまえば、これを回避できる。
┌──────────────────────────────────────┐
│INSERT INTO `表`                                                            │
│    SET `列` = 値,                                                          │
│        `順` = (SELECT `順` + 1                                             │
│                    FROM (                                                  │
│                        SELECT MAX(`順`) AS `順`                            │
│                            FROM `表`                                       │
│                    ) AS `別表`);                                           │
└──────────────────────────────────────┘
分類:MySQL
MySQL/権限の確認方法
2015年03月08日
自分の権限を確認する場合は以下の通り。
┌──────────────────────────────────────┐
│SHOW GRANTS FOR CURRENT_USER();                                             │
└──────────────────────────────────────┘

「CURRENT_USER()」をユーザ名に置き換えれば他者の権限も確認できる。
分類:MySQL
MySQL/データフォルダ移動
2014年07月20日
以下の順で行う。

(1) MySQLを(サービスの停止にて)停止させる。

(2) 設定ファイル(例えば「C:\Program Files\MySQL\MySQL Server 5.5\my.ini」)にて
   「datadir」の内容を書き換える。
┌──────────────────────────────────────┐
│#datadir="C:/MySQL/data/"                                                   │
│datadir="D:/MySQL/data/"                                                    │
└──────────────────────────────────────┘

(3) 変更前フォルダの内容を変更後フォルダへ移動する。
    #当該フォルダの横に「my.ini」があるので、
      それも移動する(その内容も同様に書き換える)。

(4) MySQLを再度起動させれば完了。
分類:MySQL
MySQL/合計集計の複数条件
2014年06月30日
前回までCOUNT関数系の複数条件を扱ったが、SUM関数系の場合はどうするか?

すばり、地道にCASE文でやってしまう方法となりそうだ。
┌──────────────────────────────────────┐
│SELECT SUM(列)                                  AS `全ての集計`,            │
│       SUM(CASE WHEN 列 > 0 THEN 列 ELSE 0 END) AS `正数の集計`,            │
│       SUM(CASE WHEN 列 = 0 THEN 列 ELSE 0 END) AS `ゼロの集計`,            │
│       SUM(CASE WHEN 列 < 0 THEN 列 ELSE 0 END) AS `負数の集計`             │
│    FROM 表;                                                                │
└──────────────────────────────────────┘
もちろん条件は他の列とかを絡めたりしていろいろと対応できる。
分類:MySQL
MySQL/件数集計の複数条件(2)
2014年06月29日
前回の方法をSUM関数を使って行うこともできる。
┌──────────────────────────────────────┐
│SELECT SUM(TRUE)           AS `全ての件数(NULLを含む)`,                     │
│       SUM(列 IS NOT NULL) AS `全ての件数(NULLを除く)`,                     │
│       SUM(列 > 0)         AS `正数の集計`,                                 │
│       SUM(列 = 0)         AS `ゼロの集計`,                                 │
│       SUM(列 < 0)         AS `負数の集計`                                  │
│    FROM 表;                                                                │
└──────────────────────────────────────┘
これは「TRUE」が「1」、「FALSE」が「0」と換算されることを利用している。
(ちなみに「NULL」は「NULL」のままだが集計から除外されるのでほぼ「0」扱い)
  ・SELECT SUM(TRUE);              → 1
  ・SELECT SUM(FALSE);             → 0
  ・SELECT SUM(NULL);              → NULL
  ・SELECT COALESCE(SUM(NULL), 0); → 0

データが1件もない場合については、
こちらは(上記列全てが)「NULL」となってしまうので
念のため「COALESCE(,0)」で「0」変換の補正を付けてあげた方がより無難かも。
┌──────────────────────────────────────┐
│SELECT COALESCE(SUM(TRUE)          , 0) AS `全ての件数(NULLを含む)`,        │
│       COALESCE(SUM(列 IS NOT NULL), 0) AS `全ての件数(NULLを除く)`,        │
│       COALESCE(SUM(列 > 0)        , 0) AS `正数の集計`,                    │
│       COALESCE(SUM(列 = 0)        , 0) AS `ゼロの集計`,                    │
│       COALESCE(SUM(列 < 0)        , 0) AS `負数の集計`                     │
│    FROM 表;                                                                │
└──────────────────────────────────────┘
但し、データが1件以上あれば、条件に一致しなくても「0」となる。
#正数が1件だけあっても、それで負数の集計ではFALSE(=0)が1件と換算されるので
  負数の集計が(0となり)NULLになることはない。
分類:MySQL
MySQL/件数集計の複数条件(1)
2014年06月28日
┌──────────────────────────────────────┐
│SELECT COUNT(*) FROM 表 WHERE 列 > 0;                                       │
│SELECT COUNT(*) FROM 表 WHERE 列 = 0;                                       │
│SELECT COUNT(*) FROM 表 WHERE 列 < 0;                                       │
└──────────────────────────────────────┘
上記を同時に行う方法。

┌──────────────────────────────────────┐
│SELECT COUNT(*)              AS `全ての件数(NULLを含む)`,                   │
│       COUNT(列)             AS `全ての件数(NULLを除く)`,                   │
│       COUNT(列 > 0 OR NULL) AS `正数の件数`,                               │
│       COUNT(列 = 0 OR NULL) AS `ゼロの件数`,                               │
│       COUNT(列 < 0 OR NULL) AS `負数の件数`                                │
│    FROM 表;                                                                │
└──────────────────────────────────────┘

COUNT関数はNULL以外の件数を数えるのだが、
これと以下の論理和条件(●)を駆使して、FALSEをNULLに置換させることにより
条件に一致するものだけをNULL以外としてカウントするという仕組みだ。
  ・(TRUE  AND TRUE ) → TRUE     ・(TRUE  OR  TRUE ) → TRUE
  ・(TRUE  AND FALSE) → FALSE    ・(TRUE  OR  FALSE) → TRUE
  ・(TRUE  AND NULL ) → NULL     ●(TRUE  OR  NULL ) → TRUE
  ・(FALSE AND FALSE) → FALSE    ・(FALSE OR  FALSE) → FALSE
  ・(FALSE AND NULL ) → FALSE    ●(FALSE OR  NULL ) → NULL
  ・(NULL  AND NULL ) → NULL     ・(NULL  OR  NULL ) → NULL
分類:MySQL
SQL/条件付き追加・削除
2014年03月31日
「OR REPLACE」   「REPLACE」…存在したら置き換える
「IF NOT EXISTS」「IGONRE」 …存在したら作らない
「IF EXISTS」               …存在しなかったら消さない
┌───────────────┬─────┬─────┐
│                              │  MySQL   │PostgreSQL│
├───────────────┼─────┼─────┤
│CREATE DATABASE               │    ○    │    ○    │
│CREATE OR REPLACE DATABASE    │    ×    │    ×    │
│CREATE DATABASE IF NOT EXISTS │    ○    │    ×    │
│───────────────│─────│─────│
│DROP DATABASE                 │    ○    │    ○    │
│DROP DATABASE IF EXISTS       │    ○    │    ×    │
├───────────────┼─────┼─────┤
│CREATE TABLE                  │    ○    │    ○    │
│CREATE OR REPLACE TABLE       │    ×    │    ×    │
│CREATE TABLE IF NOT EXISTS    │    ○    │    ×    │
│───────────────│─────│─────│
│DROP TABLE                    │    ○    │    ○    │
│DROP TABLE IF EXISTS          │    ○    │    ×    │
├───────────────┼─────┼─────┤
│CREATE INDEX                  │    ○    │    ○    │
│CREATE OR REPLACE INDEX       │    ×    │    ×    │
│CREATE INDEX IF NOT EXISTS    │    ×    │    ×    │
│───────────────│─────│─────│
│DROP INDEX                    │    ○    │    ○    │
│DROP INDEX IF EXISTS          │    ×    │    ×    │
├───────────────┼─────┼─────┤
│CREATE VIEW                   │    ○    │    ○    │
│CREATE OR REPLACE VIEW        │    ○    │    ○    │
│CREATE VIEW IF NOT EXISTS     │    ×    │    ×    │
│───────────────│─────│─────│
│DROP VIEW                     │    ○    │    ○    │
│DROP VIEW IF EXISTS           │    ○    │    ×    │
├───────────────┼─────┼─────┤
│CREATE TRIGGER                │    ○    │    ○    │
│CREATE OR REPLACE TRIGGER     │    ×    │    ×    │
│CREATE TRIGGER IF NOT EXISTS  │    ×    │    ×    │
│───────────────│─────│─────│
│DROP TRIGGER                  │    ○    │    ○    │
│DROP TRIGGER IF EXISTS        │    ○    │    ×    │
├───────────────┼─────┼─────┤
│INSERT                        │    ○    │    ○    │
│REPLACE                       │    ○    │    ×    │
│INSERT IGNORE                 │    ○    │    ×    │
│───────────────│─────│─────│
│DELETE                        │    ○    │    ○    │
└───────────────┴─────┴─────┘
分類:SQL、PostgreSQL、MySQL
MySQL/結果に連番をふる
2014年03月06日
得点が多い順にならべて順位をつけるSQLは以下のような感じ。
┌──────────────────────────────────────┐
│SELECT 列,                                                                  │
│       (SELECT COUNT(*)                                                     │
│            FROM 表 AS 別表                                                 │
│            WHERE 表.得点 < 別表.得点                                       │
│       ) + 1 AS `順位`                                                      │
│    FROM 表                                                                 │
│    ORDER BY 得点 DESC;                                                     │
└──────────────────────────────────────┘

逆に、失点の少ない順にならべて順位をつけるSQLは以下のような感じ。
┌──────────────────────────────────────┐
│SELECT 列,                                                                  │
│       (SELECT COUNT(*)                                                     │
│            FROM 表 AS 別表                                                 │
│            WHERE 表.失点 > 別表.失点                                       │
│       ) + 1 AS `順位`                                                      │
│    FROM 表                                                                 │
│    ORDER BY 失点 ASC;                                                      │
└──────────────────────────────────────┘

自己結合を使う。
分類:MySQL
MySQL/ひとつだけ
2013年11月09日
所有者が一つだけしたデータを持てない状況の場合。

これから所有者を更新しようとする場合、既に所有者が他に持っていたら
NULLを更新するという条件付きのUPDATE文を考えた。

案1:COUNTして条件分岐する
┌──────────────────────────────────────┐
│UPDATE 表                                                                   │
│    SET 所有者 = (CASE (SELECT COUNT(*)                                     │
│                            FROM (SELECT * FROM 表) AS 一時表               │
│                            WHERE 所有者 = 値)                              │
│                    WHEN 0 THEN 値                                          │
│                    ELSE        NULL                                        │
│                  END)                                                      │
│    WHERE キー = キー値;                                                    │
└──────────────────────────────────────┘

案2:NOT EXISTSを使う
┌──────────────────────────────────────┐
│UPDATE 表                                                                   │
│    SET 所有者 = (SELECT 値                                                 │
│                      FROM DUAL                                             │
│                      WHERE NOT EXISTS (                                    │
│                                SELECT *                                    │
│                                    FROM (SELECT * FROM 表) AS 一時表       │
│                                    WHERE 所有者 = 値))                     │
│    WHERE キー = キー値;                                                    │
└──────────────────────────────────────┘
分類:MySQL
前へ 1 2 次へ