mysqlでエラー1093

mysql 5.7.9を新規に立ち上げmysql 5.1.39上で動作していたシステムを移行したところ

エラー1093が発生

1093 You can't specify target table 'テーブル' for update in FROM clause UPDATE テーブル SET FD5001 = (SELECT MAX_VAL FROM (SELECT IFNULL(MAX(T1.FD5001), 0) AS MAX_VAL FROM テーブル T1) T) WHERE MESH_NO = '999999999'

updateの対象テーブルをサブクリーのfromで指定するなという至極まともなエラーだけど、やっぱり今まで動作していたSQLは動作して欲しい!

ということで調べると
my.cnfに以下を追加するとよいとのこと

optimizer_switch=derived_merge=off

記述後mysqlを再起動してもエラーは出っ放し!

show varablesで確認すると設定は正しく反映されている

結局5.7.9をあきらめ5.7.21をインストールした。

5.7.9はこれ以外にも問題が多すぎる

カテゴリー: MySQL

MySQL イベントスケジューラー

MySQLのイベントスケジューラーはバッチ処理やセッション管理に利用可能。

イベントスケジューラーが有効かを確認

mysql> show variables like '%event%';
+----------------------------------------------------------+-------+
| Variable_name                                            | Value |
+----------------------------------------------------------+-------+
| binlog_rows_query_log_events                             | OFF   |
| event_scheduler                                          | OFF   |
| log_bin_use_v1_row_events                                | OFF   |
| performance_schema_events_stages_history_long_size       | 10000 |
| performance_schema_events_stages_history_size            | 10    |
| performance_schema_events_statements_history_long_size   | 10000 |
| performance_schema_events_statements_history_size        | 10    |
| performance_schema_events_transactions_history_long_size | 10000 |
| performance_schema_events_transactions_history_size      | 10    |
| performance_schema_events_waits_history_long_size        | 10000 |
| performance_schema_events_waits_history_size             | 10    |
+----------------------------------------------------------+-------+
11 rows in set (0.00 sec)

my.cnfのmysqldセクションに以下を記述して再起動

イベント用のクエリを作成し、実行

CREATE EVENT イベント名
	ON SCHEDULE
		EVERY 5 MINUTE STARTS '2015-06-30 15:00:44'
	ON COMPLETION PRESERVE
	ENABLE
	COMMENT 'コメント'
	DO BEGIN

	イベントで行う処理

END
カテゴリー: MySQL

MySQL group byでエラー

MySQLのバージョンを5.1.39から5.7.9にあげたら今まで動作していたSQLがエラーになった。

ログを確認すると以下のエラーが出力されていた。

DB EXECUTE ERR 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column '項目名' 
which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 

group by した項目以外はselectできないよというエラー。

もちろんそれは正しいが、今まで動作していたSQLは引き続き動作してほしい。

MySQLは5.7からsql_modeにonly_full_group_byが設定されているようだ。

念のためにsql_modeに何が設定されているかを確認。

■バージョン5.1.39の場合
mysql> show variables like ‘sql_mode%’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| sql_mode | |
+—————+——-+
1 row in set (0.00 sec)

■バージョン5.7.9の場合
mysql> show variables like ‘sql_mode%’;
+—————+——————————————————————————————————————————————-+
| Variable_name | Value |
+—————+——————————————————————————————————————————————-+
| sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+—————+——————————————————————————————————————————————-+
1 row in set (0.00 sec)

my.cnfに以下の記述を追加する。

sql_mode=''

以上でエラーは回避できる

カテゴリー: MySQL

Gitについて

リモートリポジトリについて

リモートリポジトリを特定するにはOriginとブランチを指定する。

OriginはURLのaliasであり、ブランチは枝を表す。

例えばローカルリポジトリの内容をリモートリポジトリに反映する時は以下のコマンドを使用

git push origin master

originはリモートリポジトリのURL
masterはブランチ

以下のコマンドで現在のoriginの情報を確認する

git config --list

出力結果

core.symlinks=false
core.autocrlf=false
core.fscache=true
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
help.format=html
rebase.autosquash=true
http.sslcainfo=C:/Git/mingw64/ssl/certs/ca-bundle.crt
http.sslbackend=openssl
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
credential.helper=manager
user.email='tarumi@kk-kernel.co.jp'
user.name='tarumi
core.quotepath=off
core.editor='/C/Program Files (x86)/Hidemaru/hidemaru.exe' //fu8
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
remote.origin.url=git@gitlab.com:ワークスペース名/プロジェクト名.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
カテゴリー: git

git 変更をキャンセル

ソースファイルを編集したがコミット前にやっぱり元に戻したい時はcheckoutコマンド

git checkout ブランチ名 ファイル名

ローカルリポジトリのブランチは以下のコマンドで確認

git branch

コミット前であればインデックスに反映した後でも有効

以下は例

C:\githome\prvkernel\freearea>git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   source/FreeArea/FreeArea.suo


C:\githome\prvkernel\freearea>git branch
* master

C:\githome\prvkernel\freearea>git checkout master source/FreeArea/FreeArea.suo

C:\githome\prvkernel\freearea>git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

カテゴリー: git

MySQL5.1のDBのダンプをMySQL5.7のDBにインポートしたらSQL エラー (1118): Row size too large (> 8126)

MySQL5.1のDBのダンプをMySQL5.7おDBにインポートしたらSQL エラー (1118): Row size too large (> 8126)が発生した。
特定のテーブルでこのエラーが発生しており、このテーブルではvarcharで定義された項目が400程度もある。
InnoDBではレコードサイズが8192を超えてはだめらしい。
MySQL5.1ではチェックが甘いためか?
このSQLが通っていたがMySQL5.7ではそれがだめになったようだ。
根本的な解決策はQiitaを参照するとして、
今回はとりあえずエラーを回避するためにエラーチェックを緩くする。

確認のために以下のSQLを実行するとエラーが発生。

create table TESTSIZE
(
FLD01	varchar(12),
FLD02	varchar(12),
省略
FLD298	varchar(12),
FLD299	varchar(12),
FLD300	varchar(12)
)ENGINE=InnoDB

その後、以下のコマンドで環境変数を変更してSQLを実行すると警告は表示されるが無事にテーブルは作成される。

set innodb_strict_mode=0;

恒久的な処置としてはmy.cnfに以下を追加

innodb_strict_mode = 0

MySQLを再起動して対応

こちらも参考にさせていただきました
teratail

カテゴリー: MySQL

git 既存ファイルを編集

既存のファイルを編集後リモートリポジトリに反映

変更されたファイルをインデックスに追加

git add -u

ファイルをローカルリポジトリにコミット

git commit -a -m "コメント"

ファイルをリモートレポジトリに反映

git push origin master
Enter passphrase for key '/c/Users/tarumi/.ssh/id_rsa': SSLキーのパスワードを入力