20210609のMySQLに関する記事は7件です。

【Laravel】SQL発行回数を減らす 〜複数レコードを一気にDBへ保存する方法〜

Laravelで複数レコードを保存する際、一度のSQL発行で処理する方法を考える。 現状は4つのレコードを保存する為に、4回SQLを発行している。 コードは以下の通り。 RoomController.php //1人目 $room_player_1 = RoomPlayer::create([ "name" => null, "room_id" => $room_id, "user_id" => 1, ]); //2人目 $room_player_2 = RoomPlayer::create([ "name" => null, "room_id" => $room_id, "user_id" => 2, ]); //3人目 $room_player_3 = RoomPlayer::create([ "name" => null, "room_id" => $room_id, "user_id" => 3, ]); //4人目 $room_player_4 = RoomPlayer::create([ "name" => null, "room_id" => $room_id, "user_id" => 4, ]); これを一度のSQL発行で処理するには、以下のようにデータを配列に格納し、insert( )で保存する。 ※ちなみに、save(), create() で複数データをテーブルに格納する場合, foreach() 等で繰り返し処理をする必要がある。 RoomController.php $players = [ ["name" => null, "room_id" => $room_id, "user_id" => 1], ["name" => null, "room_id" => $room_id, "user_id" => 2], ["name" => null, "room_id" => $room_id, "user_id" => 3], ["name" => null, "room_id" => $room_id, "user_id" => 4] ]; $save_players = RoomPlayer::insert($players);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【MySQL】M1 mac linux ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)

自分でも驚くくらい凡ミスで悩んでいたためメモ。 mysqlを起動させようとスタートすると、エラー文字。 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) とりあえず、/tmpディレクトリ配下にmysql.sockを作成。 cd /tmp/ touch mysql.sock アクセス権限をオールクリア chmod 777 mysql.sock すると()の中が2から38に変わった。 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38) しかし、よく似た記事を発見。 その記事では、 mysql.server start を飛ばしていたとのこと。 自分のコマンドを見直すと、 mysql server.start になっていた。 mysqlでERROR 2002 (HY000)のエラーが出たら、 もしかしたらいつもと違うことをやっているだけの可能性がある ということを疑っても良いかもしれない。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQL データの値のレンジで出力内容を指定する

目的 MySQLのselect句などの出力するレコードの指定で、指定カラムの値をレンジで指定する方法をメモ的にまとめる 方法 下記の様に記載する。 select * from テーブル名 where カラム名 between レンジの最上値(もしくは最下値) and レンジの最下値(もしくは最上値) 例えばusersテーブルのidが4から19のユーザー情報をselectで出力したいなら下記を実行する。 select * from users where id between 4 and レンジの19
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

mysqlの接続時に1044 Access denied

mysqlに接続 terminal mysql -u root データベース作成 terminal create database hoge; ユーザー作成 terminal create user 'user'@'localhost' identified by 'hogehoge'; 権限の付与 terminal grant all privileges on *.* to 'user'@'localhost' with grant option; djangoの設定 settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'hoge', 'USER': 'user', 'PASSWORD': 'hogehoge', 'HOST': 'localhost', 'PORT': '3306', } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WHERE 等価結合 / INNER JOIN / LEFT OUTER JOIN / RIGHT OUTER JOIN の違い @ MariaDB

環境 MariaDB 10.3.29-MariaDB-0ubuntu0.20.04.1 Ubuntu 20.04 LTS シノニム JOIN → INNER JOIN LEFT JOIN → LEFT OUTER JOIN RIGHT JOIN → RIGHT OUTER JOIN テストテーブル MariaDB [test]> select * from 会員; +----+-----------------+-----------+ | id | 漢字氏名 | ランク | +----+-----------------+-----------+ | 1 | 白き帝王 | 10 | | 2 | 紅き小惑星 | 1 | | 3 | 破壊連星 | 1 | | 4 | 聖なる眼 | NULL | +----+-----------------+-----------+ 4 rows in set (0.000 sec) MariaDB [test]> SELECT * FROM ランク属性; +-----------+--------------+ | ランク | ランク名 | +-----------+--------------+ | 1 | 下っ端 | | 10 | 聖帝 | | 100 | 神 | +-----------+--------------+ 3 rows in set (0.000 sec) WHERE 等価結合 / INNER JOIN MariaDB [test]> SELECT * FROM 会員,ランク属性 WHERE 会員.ランク=ランク属性.ラン ク; +----+-----------------+-----------+-----------+--------------+ | id | 漢字氏名 | ランク | ランク | ランク名 | +----+-----------------+-----------+-----------+--------------+ | 1 | 白き帝王 | 10 | 10 | 聖帝 | | 2 | 紅き小惑星 | 1 | 1 | 下っ端 | | 3 | 破壊連星 | 1 | 1 | 下っ端 | +----+-----------------+-----------+-----------+--------------+ 3 rows in set (0.001 sec) MariaDB [test]> SELECT * FROM 会員 INNER JOIN ランク属性 ON 会員.ランク=ランク属性.ランク; +----+-----------------+-----------+-----------+--------------+ | id | 漢字氏名 | ランク | ランク | ランク名 | +----+-----------------+-----------+-----------+--------------+ | 1 | 白き帝王 | 10 | 10 | 聖帝 | | 2 | 紅き小惑星 | 1 | 1 | 下っ端 | | 3 | 破壊連星 | 1 | 1 | 下っ端 | +----+-----------------+-----------+-----------+--------------+ 3 rows in set (0.000 sec) 同じ結果ですね。 LEFT OUTER JOIN / RIGHT OUTER JOIN 主テーブルを全部表示。従テーブルに該当が無い場合はNULL表示。 LEFT / RIGHT は JOIN 句の左側が主テーブルか右側が主テーブルかの違い。 MariaDB [test]> SELECT * FROM 会員 LEFT OUTER JOIN ランク属性 ON 会員.ランク=ラ ンク属性.ランク; +----+-----------------+-----------+-----------+--------------+ | id | 漢字氏名 | ランク | ランク | ランク名 | +----+-----------------+-----------+-----------+--------------+ | 2 | 紅き小惑星 | 1 | 1 | 下っ端 | | 3 | 破壊連星 | 1 | 1 | 下っ端 | | 1 | 白き帝王 | 10 | 10 | 聖帝 | | 4 | 聖なる眼 | NULL | NULL | NULL | +----+-----------------+-----------+-----------+--------------+ 4 rows in set (0.001 sec) JOIN 句より左側を主テーブルとし、主テーブルを全部表示。従テーブルに該当が無い場合はNULL表示。 MariaDB [test]> SELECT * FROM 会員 RIGHT OUTER JOIN ランク属性 ON 会員.ランク=ランク属性.ランク; +------+-----------------+-----------+-----------+--------------+ | id | 漢字氏名 | ランク | ランク | ランク名 | +------+-----------------+-----------+-----------+--------------+ | 1 | 白き帝王 | 10 | 10 | 聖帝 | | 2 | 紅き小惑星 | 1 | 1 | 下っ端 | | 3 | 破壊連星 | 1 | 1 | 下っ端 | | NULL | NULL | NULL | 100 | 神 | +------+-----------------+-----------+-----------+--------------+ 4 rows in set (0.000 sec) JOIN 句より右側を主テーブルとし、主テーブルを全部表示。従テーブルに該当が無い場合はNULL表示。 テーブル位置を逆に MariaDB [test]> SELECT * FROM ランク属性 RIGHT OUTER JOIN 会員 ON 会員.ランク=ランク属性.ランク; +-----------+--------------+----+-----------------+-----------+ | ランク | ランク名 | id | 漢字氏名 | ランク | +-----------+--------------+----+-----------------+-----------+ | 1 | 下っ端 | 2 | 紅き小惑星 | 1 | | 1 | 下っ端 | 3 | 破壊連星 | 1 | | 10 | 聖帝 | 1 | 白き帝王 | 10 | | NULL | NULL | 4 | 聖なる眼 | NULL | +-----------+--------------+----+-----------------+-----------+ 4 rows in set (0.000 sec) MariaDB [test]> SELECT * FROM ランク属性 LEFT OUTER JOIN 会員 ON 会員.ランク=ラ ンク属性.ランク; +-----------+--------------+------+-----------------+-----------+ | ランク | ランク名 | id | 漢字氏名 | ランク | +-----------+--------------+------+-----------------+-----------+ | 10 | 聖帝 | 1 | 白き帝王 | 10 | | 1 | 下っ端 | 2 | 紅き小惑星 | 1 | | 1 | 下っ端 | 3 | 破壊連星 | 1 | | 100 | 神 | NULL | NULL | NULL | +-----------+--------------+------+-----------------+-----------+ 4 rows in set (0.001 sec) テーブル位置を逆にしたうえで、LEFT/RIGHT を逆にすると(上記ではフィールド並びは異なりますが)先ほどと同じ結果が得られます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MariaDB で カラム名変更

カラム名を変更しようとするとエラーが出る MariaDB [test]> ALTER TABLE B RENAME COLUMN id to c; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'COLUMN id to c' at line 1 MariaDB [test]> 環境 MariaDB 10.3.29-MariaDB-0ubuntu0.20.04.1 Ubuntu 20.04 LTS トラブルシュート 以下は問題ない。 ALTER TABLE A RENAME TO B ALTER TABLE B ADD COLUMN d int; ALTER TABLE B DROP COLUMN d; によると、 Starting with MariaDB 10.5.2 you should be able to do ということらしいです MariaDB [(none)]> select version(); +----------------------------------+ | version() | +----------------------------------+ | 10.3.29-MariaDB-0ubuntu0.20.04.1 | +----------------------------------+ 1 row in set (0.001 sec) ということなので、対応していないということですね。 MariaDB [test]> ALTER TABLE B CHANGE COLUMN id c INT; Query OK, 0 rows affected (0.008 sec) Records: 0 Duplicates: 0 Warnings: 0 として代わりとします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[SQL] MySQLでSQLを学ぶ~DDL編②~

はじめに 前回の続きでDDLのSQLをまとめていきたいと思います。 前回はデータベースの操作方法でした。今回はテーブルの操作方法です。 USE文 USE文はデータベースを指定するSQL文です。 USE 《database名》 でデータベースを指定します。 テーブルを作成する際、どのデータベースで作成するのか分からないのでUSE文で指定する必要があります。 実際に選択します。その前に前回削除したので、もう一度データベースを作成です。 ターミナル mysql> CREATE DATABASE sqltest; Query OK, 1 row affected (0.01 sec) 成功したらUSEで選択します。 ターミナル mysql> USE sqltest; Database changed これで作成したデータベースをいじれます。 テーブルとカラムを作成する テーブルとカラムを作成する時はCREATE TABLE文を使用します。 テーブル名やカラム名、カラムの型は下記のように指定し、作成します。 mysql> CREATE TABLE テーブル名 (カラム名1 カラム名1の型, カラム名2 カラム名2の型, …); Railsでrails db:migrateが実行されると、実はCREATE TABLEが動いていたのです。 実際にSQLでテーブルを作ってみます。 今回は、商品の情報を保存することを想定し、goodsという名前のテーブルを作ります。 このテーブルのカラムには商品idを数値で保存するidカラムと商品名を文字列で保存するnameカラムを作成したいです。 Railsでカラムを設定する場合は、数字であればinteger型、文字であればstring型と指定していました。 SQLでも指定は必要ですが、表し方が違います。 型名 保存できる値 INT 数字 VARCHAR(M) 最大M文字の文字列 今回はidは数字なのでINT型 nameは文字なのでVARCHAR(255)型としてgoodsテーブルを作成します。 CREATE TABLEでテーブルgoodsを作成します。 ターミナル mysql> CREATE TABLE goods (id INT, name VARCHAR(255)); Query OK, 0 rows affected (0.09 sec) 2行目が表示されれば成功です。 作成したテーブルもSHOW文で確認できます。 ターミナル mysql> SHOW TABLES; +-------------------+ | Tables_in_sqltest | +-------------------+ | goods | +-------------------+ 1 row in set (0.00 sec) このように表示されれば正しく作成できています。 FROM句 ただ単にSHOWを先ほどのように使うとデータベースにあるテーブル名しか確認できません。 追加したカラムを確認するような、テーブルの構造を確認するにはFROM句というのを使います。 FROM句は対象となるテーブルを指定するときに使います。 ターミナル mysql> SHOW columns FROM goods; goodsテーブルのカラムを見してくれ!みたいな意味の命令文です。 ターミナル mysql> SHOW columns FROM goods; +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(255) | YES | | NULL | | +-------+--------------+------+-----+---------+-------+ 2 rows in set (0.02 sec) これで先ほど作ったカラムもしっかり作成されていることが確認できますね。 ALTER文 後からカラムを追加したいと思った時、ALTER(オルター)文を使うとデータベースやテーブルの編集できます。 例えば、カラムを一つだけ追加しようとするなら、下記のように記述します mysql> ALTER TABLE テーブル名 ADD カラム名 カラムの型; 複数追加したい場合 mysql> ALTER TABLE テーブル名 ADD (カラム名 カラムの型, ……); 今回はpriceとzaikoというカラムを追加します。 ターミナル mysql> ALTER TABLE goods ADD (price int, zaiko int); Query OK, 0 rows affected (0.07 sec) Records: 0 Duplicates: 0 Warnings: 0 これで追加完了したはずです、確認してみましょう ターミナル mysql> SHOW columns FROM goods; +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(255) | YES | | NULL | | | price | int(11) | YES | | NULL | | | zaiko | int(11) | YES | | NULL | | +-------+--------------+------+-----+---------+-------+ 4 rows in set (0.01 sec) 追加したカラムが表示されていたら成功です。 ALTER文は編集ができるので、カラムを変更することもできます。 zaikoというカラム名を英語表記のstockにしましょう。 変更する時は下記のように記述します。 mysql> ALTER TABLE テーブル名 CHANGE 古いカラム名 新しいカラム名 新しいカラムの型; この場合カラムの型を変更しないとしても、もう一度カラムの型を記述する必要があります。 上記の記述に変更したい内容を当てはめて実際に実行します。 ターミナル mysql> ALTER TABLE goods CHANGE zaiko stock int; Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0 これでzaikoカラムが変更されているはずです。 確認してみましょう ターミナル mysql> SHOW columns FROM goods; +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(255) | YES | | NULL | | | price | int(11) | YES | | NULL | | | stock | int(11) | YES | | NULL | | +-------+--------------+------+-----+---------+-------+ 4 rows in set (0.00 sec) 次が最後です。 ALTER文を使ってカラムを削除します。 mysql> ALTER TABLE テーブル名 DROP カラム名; これに当てはめて、カラムの削除を実際に行います。 ターミナル mysql> ALTER TABLE goods DROP stock; Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0 削除されているか確認しましょう。 ターミナル mysql> SHOW columns FROM goods; +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(255) | YES | | NULL | | | price | int(11) | YES | | NULL | | +-------+--------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) stockがしっかり削除していますね。  最後に 二回にわたってSQLのDDLの主な命令文を学びました。これでもSQLのほんの一部だと思いますが、だんだんとデータベース学習が少し楽しくなってきました。 これからもっとデータベースの理解を深めていきたいです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む