20210508のMySQLに関する記事は2件です。

初学者向け-MySQLの学習記録-

MySQLの学習記録 目次 テーブルの作成 テーブルの削除 テーブルの構造の確認 テーブル一覧の確認 テーブル内のデータの確認 主に使用するデータ型 デフォルト値とnull 値の制限 primarykeyについて selectについて andやorについて 部分一致や前方一致などの検索方法 nullのレコードが表示されない レコードの整列や取り出し 関数(数値) 関数(文字列) 日付の関数 レコードの更新について レコードの削除について 作成日時、更新日時の設定 テーブルの操作 コメントアウト 1 テーブルの作成 テーブル名posts ※テーブル名は複数形にすることが多い ex) CREATE TABLE posts (title VARCHAR(30),body VARCHAR(140), likes INT); テーブル名を指定し、カラム名とともにデータの型を指定する 2 テーブルの削除 テーブル名posts DROP TABALE posts あるかどうかの有無の条件分岐する場合 DROP TABLE IF EXISTS posts 3 データの挿入 title.body,likesへの挿入 INSERT INTO posts (title , body , likes) VALUES('タイトル','本文',4),('タイトル2','本文2',5); 4 テーブルの構造の確認 DESC posts; 実行結果 | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+-------+ | message | varchar(140) | YES | | NULL | | | likes | int(11) | YES | | NULL | | +---------+--------------+------+-----+---------+-------+ 5 テーブル一覧の確認 SHOW TABLES 実行結果 +-----------------+ | Tables_in_myapp | +-----------------+ | posts | +-----------------+ 6 テーブル内のデータの確認 SELECT * FROM posts 実行結果 +---------------+---------+-------+ | title | body | likes | +---------------+---------+-------+ | タイトル | 本文 | 4 | | タイトル2 | 本文2 | 5 | +---------------+---------+-------+ 7 主に使用するデータ型 文字型 固定長のときはCHARみたいなことらしいが、よくわからなかったので調べた。 参考:https://www.ibm.com/docs/ja/informix-servers/12.10?topic=types-fixed-varying-length-character-data データの大きさに関わらず、格納域は一定に占有されるようです。 CHAR 0~255文字 VARCHAR 0~6553文字 TEXT それ以上 ENUM 特定の文字列から1つを格納できる SET 特定の文字列から複数を格納 ※ENUM->インデックス番号でも指定できる。(0からでなはく、1からのことに注意) ※SET->左から順に2の0乗、1乗、2乗...と割り当てられており、インデックスで指定するときは足した数にする。 -- 書き方一例 -- CREATE TABLE posts ( category ENUM('sports','science','math') ); 上のようにテーブルにセットして INSERT INTO posts (category) VALUES ('sports'); すると +----------+ | category | +----------+ | math | +----------+ 別の値を挿入しようとすると ERROR 1265 (01000) at line 8: Data truncated for column 'category' at row 1 整数 ※UNSINGEDをつけることで正の値の制限することができ、正の扱える数を増やすことが可能 TINYINT -128~127 INT -21億~21億 BIGINT -922京~922億 実数 DECIMAL 固定小数点 FLOAT 浮動小数点 DOUBLE 浮動小数点(精度が高い) 書き方一例 hogehoge DECIMAL(5, 2) UNSIGNED (全体で5桁、小数点以下は2桁) 真偽値,日時 BOOL 真か疑か(true[1] or false[0]) DATE 日付 TIME 時間 DATETIME 日時 一例 CREATE TABLE posts ( trueorfalse BOOL, created_time DATETIME ); INSERT INTO posts (trueorfalse,created_time) VALUES (FALSE,NOW()), (0,NOW()), (1,'2025-02-03 16:02:41'); SELECT * FROM posts; 結果 +-------------+---------------------+ | trueorfalse | created_time | +-------------+---------------------+ | 0 | 2021-05-09 01:00:57 | | 0 | 2021-05-09 01:00:57 | | 1 | 2025-02-03 16:02:41 | +-------------+---------------------+ 8 デフォルト値とnull カラム指定時に、NULLを認めるか認めないか指定をできる。 デフォルト値を設定しておくと、データの挿入がない場合NULLではなくその値が挿入される。 CREATE TABLE posts ( title VARCHAR(20) NOT NULL, body VARCHAR(30) DEFAULT 'デフォルトぶん', likes INT DEFAULT 0, nullok CHAR(2)); INSERT INTO posts (title,body) VALUES ('テスト','本文'); INSERT INTO posts(title) VALUES('テスト'); SELECT * FROM posts; 実行結果 +-----------+-----------------------+-------+--------+ | title | body | likes | nullok | +-----------+-----------------------+-------+--------+ | テスト | 本文 | 0 | NULL | | テスト | デフォルトぶん | 0 | NULL | +-----------+-----------------------+-------+--------+ 9 値の制限 値の範囲に制限をつける場合-ANDなど ex) CREATE TABLE students ( number INT CHECK(number >= 0 AND number <=150) ); INSERT INTO students (number) VALUES (170); SELECT * FROM students; 実行結果 ERROR 4025 (23000) at line 6: CONSTRAINT `students.number` failed for `myapp`.`students` 重複をチェックする場合-UNIQUEで対処 ex) CREATE TABLE students ( name VARCHAR(20) UNIQUE, number INT CHECK(number >= 0 AND number <=150) ); INSERT INTO students (name, number) VALUES ('hogehoge',136), ('hogehoge',135); ERROR 1062 (23000) at line 7: Duplicate entry 'hogehoge' for key 'name' 10 primarykeyについて レコードを一意に識別できるようにするカラムを設定することが一般的 (要するにユニークなidを当てることが多い。社員番号とかユニークな番号なはず。) PRIMARY KEYは重複は許されない AUTO_INCREMENTを設定することで自動で連番で番号を振ってくれる ex) CREATE TABLE posts ( id INT NOT NULL AUTO_INCREMENT, title VARCHAR(40), body VARCHAR(200), PRIMARY KEY (id) ); INSERT INTO posts (title,body) VALUES ('テスト', 'テスト本文'), ('taitoru', 'テスト本文'), ('タイトル', 'テスト本文'); INSERT INTO posts (title,body) VALUES ('テスト4', 'テスト本文4'); SELECT * FROM posts; 実行結果 +----+--------------+------------------+ | id | title | body | +----+--------------+------------------+ | 1 | テスト | テスト本文 | | 2 | taitoru | テスト本文 | | 3 | タイトル | テスト本文 | | 4 | テスト4 | テスト本文4 | +----+--------------+------------------+ こんな感じで勝手に連番で入れてくれる 11 selectについて postsテーブルから全て(*)のレコードを取り出す SELECT * FROM posts; 条件を付けくわえるのには「WHERE」を使う 主に使うのは下記 = !=(<>) < > <= >= ex) SELECT id ,likes FROM posts WHERE number >=10; SELECT * FROM posts WHERE title ="タイトル" ; SELECT * FROM posts WHERE title != "タイトル" ; SELECT * FROM posts WHERE title <> "タイトル" ; 12 andやorについて AND なおかつ OR または ex) SELECT * FROM posts WHERE number >=5 AND likes <=14 ; SELECT * FROM posts WHERE number BETWEEN 5 AND 14 ; #上の書き換え SELECT * FROM posts WHERE number NOT BETWEEN 5 AND 14 ;#反転 SELECT * FROM posts WHERE number = 6 OR number = 15 ; SELECT * FROM posts WHERE number IN (6,15) ; #上の書き換え SELECT * FROM posts WHERE number NOT IN (6,15) ; #反転 13 部分一致や前方一致などの検索方法 %: 0文字以上の任意の文字を表現できる _: 任意の1文字を表現できる ex) CREATE TABLE posts ( id INT NOT NULL AUTO_INCREMENT, body VARCHAR(200), PRIMARY KEY (id) ); INSERT INTO posts (body) VALUES ('本や本文'), ('今日本屋'), ('今日は本屋'), ('本日のタスク'), ('Thankyou'), ('thankyou'), ('Goodbye'); SELECT * FROM posts WHERE body like '__本%'; #3文字目に"本"が入っているレコード SELECT * FROM posts WHERE body NOT like '__本%'; #3文字目に"本"が入っていないレコード SELECT * FROM posts WHERE body LIKE 't%'; #前方一致 SELECT * FROM posts WHERE body LIKE BINARY 't%'; #前方一致(大文字/小文字区別ver) SELECT * FROM posts WHERE body LIKE '%e'; #後方一致 SELECT * FROM posts WHERE body like '%タスク%'; #部分一致 実行結果 +----+--------------+ | id | body | +----+--------------+ | 1 | 本ほ本文 | | 2 | 今日本屋 | +----+--------------+ +----+--------------------+ | id | body | +----+--------------------+ | 3 | 今日は本屋 | | 4 | 本日のタスク | | 5 | Thankyou | | 6 | thankyou | | 7 | Goodbye | +----+--------------------+ +----+----------+ | id | body | +----+----------+ | 5 | Thankyou | | 6 | thankyou | +----+----------+ +----+----------+ | id | body | +----+----------+ | 6 | thankyou | +----+----------+ +----+---------+ | id | body | +----+---------+ | 7 | Goodbye | +----+---------+ +----+--------------------+ | id | body | +----+--------------------+ | 4 | 本日のタスク | +----+--------------------+ 14 nullのレコードが表示されない 下の状態 +----+--------------+------------------+ | id | title | body | +----+--------------+------------------+ | 1 | テストnl | テスト本文 | | 2 | テスト2nl | テスト本文2 | | 3 | NULL | テスト本文3 | | 4 | NULL | テスト本文4 | | 5 | NULL | テスト本文5 | +----+--------------+------------------+ SELECT * FROM posts WHERE title like 'テ%'; SELECT * FROM posts WHERE title NOT like 'テ%'; 実行結果 +----+--------------+------------------+ | id | title | body | +----+--------------+------------------+ | 1 | テストnl | テスト本文 | | 2 | テスト2nl | テスト本文2 | +----+--------------+------------------+ 二行目の結果NULLのレコードが表示されない そんなときは or hoge IS NULLを使う SELECT * FROM posts WHERE title NOT like 'テ%' OR title IS NULL; 実行結果 +----+-------+------------------+ | id | title | body | +----+-------+------------------+ | 3 | NULL | テスト本文3 | | 4 | NULL | テスト本文4 | | 5 | NULL | テスト本文5 | +----+-------+------------------+ 15 レコードの整列や取り出し ORDER BY; 整列するために使う DESC; 整列の順序を逆にする LIMIT 4; 上から4つ取り出す(数字は任意) LIMIT 3 OFFSET 1;上から0,1と数え1番目から3つ取り出す(数字は任意) LIMIT 1,3; テーブル内はこんな感じ +----+----------+---------+ | id | name | numbers | +----+----------+---------+ | 1 | Numao | 5 | | 2 | Ishikawa | 1 | | 3 | Katoh | 2 | | 4 | Sakurai | 3 | | 5 | Yokoya | 7 | +----+----------+---------+ やってみます SElECT * FROM students ORDER BY numbers; SElECT * FROM students ORDER BY numbers DESC; SElECT * FROM students ORDER BY name; SElECT * FROM students ORDER BY name DESC; SElECT * FROM students ORDER BY name DESC LIMIT 3; SElECT * FROM students ORDER BY name DESC LIMIT 3 OFFSET 2; SElECT * FROM students ORDER BY name DESC LIMIT 2,3; SElECT * FROM students ORDER BY name DESC LIMIT 1,4; 上記の実行結果 SElECT * FROM students ORDER BY numbers; +----+----------+---------+ | id | name | numbers | +----+----------+---------+ | 5 | Yokoya | 7 | | 1 | Numao | 5 | | 4 | Sakurai | 3 | | 3 | Katoh | 2 | | 2 | Ishikawa | 1 | +----+----------+---------+ SElECT * FROM students ORDER BY numbers DESC; +----+----------+---------+ | id | name | numbers | +----+----------+---------+ | 2 | Ishikawa | 1 | | 3 | Katoh | 2 | | 1 | Numao | 5 | | 4 | Sakurai | 3 | | 5 | Yokoya | 7 | +----+----------+---------+ SElECT * FROM students ORDER BY name; +----+----------+---------+ | id | name | numbers | +----+----------+---------+ | 5 | Yokoya | 7 | | 4 | Sakurai | 3 | | 1 | Numao | 5 | | 3 | Katoh | 2 | | 2 | Ishikawa | 1 | +----+----------+---------+ SElECT * FROM students ORDER BY name DESC; +----+----------+---------+ | id | name | numbers | +----+----------+---------+ | 5 | Yokoya | 7 | | 4 | Sakurai | 3 | | 1 | Numao | 5 | | 3 | Katoh | 2 | | 2 | Ishikawa | 1 | +----+----------+---------+ SElECT * FROM students ORDER BY name DESC LIMIT 3; +----+---------+---------+ | id | name | numbers | +----+---------+---------+ | 5 | Yokoya | 7 | | 4 | Sakurai | 3 | | 1 | Numao | 5 | +----+---------+---------+ SElECT * FROM students ORDER BY name DESC LIMIT 3 OFFSET 2; +----+----------+---------+ | id | name | numbers | +----+----------+---------+ | 1 | Numao | 5 | | 3 | Katoh | 2 | | 2 | Ishikawa | 1 | +----+----------+---------+ SElECT * FROM students ORDER BY name DESC LIMIT 2,3; +----+----------+---------+ | id | name | numbers | +----+----------+---------+ | 1 | Numao | 5 | | 3 | Katoh | 2 | | 2 | Ishikawa | 1 | +----+----------+---------+ SElECT * FROM students ORDER BY name DESC LIMIT 1,4; +----+----------+---------+ | id | name | numbers | +----+----------+---------+ | 4 | Sakurai | 3 | | 1 | Numao | 5 | | 3 | Katoh | 2 | | 2 | Ishikawa | 1 | +----+----------+---------+ 16 数値の関数について FLOOR() 端数を切り捨て CEIL() 端数を切り上げ ROUND() 四捨五入(桁数の指定もできる) 以下のようなテーブル +----+-----------------------+-------+ | id | body | likes | +----+-----------------------+-------+ | 1 | 自己紹介 | 12 | | 2 | 意見 | 4 | | 3 | 感謝 | 4 | | 4 | めっちゃ嬉しい | 15 | | 5 | 案件 | 8 | +----+-----------------------+-------+ 以下のようなものを実行 SELECT likes * 20 /2 , likes * 20 /2 AS bonus, FLOOR(likes * 350 /5) AS floor, CEIL(likes * 350 /5) AS ceil, likes * 350.4 /5 AS noround, ROUND(likes * 350.4 /5) AS round, ROUND(likes * 350.4 /5 ,2) AS round -- これが桁数指定 FROM posts; 実行結果 +---------------+----------+-------+------+------------+-------+---------+ | likes * 20 /2 | bonus | floor | ceil | noround | round | round | +---------------+----------+-------+------+------------+-------+---------+ | 120.0000 | 120.0000 | 840 | 840 | 840.96000 | 841 | 840.96 | | 40.0000 | 40.0000 | 280 | 280 | 280.32000 | 280 | 280.32 | | 40.0000 | 40.0000 | 280 | 280 | 280.32000 | 280 | 280.32 | | 150.0000 | 150.0000 | 1050 | 1050 | 1051.20000 | 1051 | 1051.20 | | 80.0000 | 80.0000 | 560 | 560 | 560.64000 | 561 | 560.64 | +---------------+----------+-------+------+------------+-------+---------+ 17 文字列の関数について SUBSTRING() -- 文字以降の文字列を取り出す(-の指定も可能) CONCAT() -- 文字を連結させる LENGTH() -- 文字数のカウント(日本語の場合は以下のCHAR_LENGTHを使用) CHAR_LENGTH() --日本語文字数対応によく使う テーブル内容 +----+-----------------+-------+ | id | body | likes | +----+-----------------+-------+ | 1 | Thanks | 5 | | 2 | Goodbye | 4 | | 3 | Arigato | 56 | | 4 | Hello | 32 | | 5 | こんにちは | 11 | | 6 | Hi! | 312 | +----+-----------------+-------+ 以下を実行 SELECT -- 3文字目以降 body, SUBSTRING(body,3) AS three, -- 末尾から3文字分以降 body, SUBSTRING(body,-3) AS anti_three FROM posts; -- 2文字目から4文字分 SELECT body, SUBSTRING(body,2,4) AS two_four FROM posts; SELECT CONCAT(body,likes) AS 連結文字なし, CONCAT(body,'-',likes) AS 連結文字あり FROM posts; SELECT body, LENGTH(body) AS len, CHAR_LENGTH(body) AS char_len FROM posts; 実行結果 +-----------------+-----------+-----------------+------------+ | body | three | body | anti_three | +-----------------+-----------+-----------------+------------+ | Thanks | anks | Thanks | nks | | Goodbye | odbye | Goodbye | bye | | Arigato | igato | Arigato | ato | | Hello | llo | Hello | llo | | こんにちは | にちは | こんにちは | にちは | | Hi! | ! | Hi! | Hi! | +-----------------+-----------+-----------------+------------+ +-----------------+--------------+ | body | two_four | +-----------------+--------------+ | Thanks | hank | | Goodbye | oodb | | Arigato | riga | | Hello | ello | | こんにちは | んにちは | | Hi! | i! | +-----------------+--------------+ +--------------------+--------------------+ | 連結文字なし | 連結文字あり | +--------------------+--------------------+ | Thanks5 | Thanks-5 | | Goodbye4 | Goodbye-4 | | Arigato56 | Arigato-56 | | Hello32 | Hello-32 | | こんにちは11 | こんにちは-11 | | Hi!312 | Hi!-312 | +--------------------+--------------------+ +-----------------+------+----------+ | body | len | char_len | +-----------------+------+----------+ | Thanks | 6 | 6 | | Goodbye | 7 | 7 | | Arigato | 7 | 7 | | Hello | 5 | 5 | | こんにちは | 15 | 5 | | Hi! | 3 | 3 | +-----------------+------+----------+ ~ $ 18 日付の関数について 公式にはたくさん書かれているが、簡単なものを今回はやりました テーブルは以下のような感じ +----+-----------+---------------------+ | id | body | created | +----+-----------+---------------------+ | 1 | Thanks | 2019-05-01 00:00:00 | | 2 | Hello | 2021-05-03 00:00:00 | | 3 | Arigato | 2021-03-14 00:00:00 | | 4 | Konithiwa | 2020-04-24 00:00:00 | | 5 | Hi | 2012-11-09 00:00:00 | +----+-----------+---------------------+ -- 年月日について SELECT created, YEAR(created), MONTH(created), DAY(created) from posts; -- フォーマットを指定する SELECT created, DATE_FORMAT(created,'%M %D %Y,%W ') AS date FROM posts; -- 日付を任意の日数たす SELECT created, DATE_ADD(created,INTERVAL 7 DAY) AS date_l FROM posts; -- 差分を出す SELECT created, now(), DATEDIFF(created,NOW()) AS diff FROM posts; 結果 +---------------------+---------------+----------------+--------------+ | created | YEAR(created) | MONTH(created) | DAY(created) | +---------------------+---------------+----------------+--------------+ | 2019-05-01 00:00:00 | 2019 | 5 | 1 | | 2021-05-03 00:00:00 | 2021 | 5 | 3 | | 2021-03-14 00:00:00 | 2021 | 3 | 14 | | 2020-04-24 00:00:00 | 2020 | 4 | 24 | | 2012-11-09 00:00:00 | 2012 | 11 | 9 | +---------------------+---------------+----------------+--------------+ +---------------------+---------------------------+ | created | date | +---------------------+---------------------------+ | 2019-05-01 00:00:00 | May 1st 2019,Wednesday | | 2021-05-03 00:00:00 | May 3rd 2021,Monday | | 2021-03-14 00:00:00 | March 14th 2021,Sunday | | 2020-04-24 00:00:00 | April 24th 2020,Friday | | 2012-11-09 00:00:00 | November 9th 2012,Friday | +---------------------+---------------------------+ +---------------------+---------------------+ | created | date_l | +---------------------+---------------------+ | 2019-05-01 00:00:00 | 2019-05-08 00:00:00 | | 2021-05-03 00:00:00 | 2021-05-10 00:00:00 | | 2021-03-14 00:00:00 | 2021-03-21 00:00:00 | | 2020-04-24 00:00:00 | 2020-05-01 00:00:00 | | 2012-11-09 00:00:00 | 2012-11-16 00:00:00 | +---------------------+---------------------+ +---------------------+---------------------+-------+ | created | now() | diff | +---------------------+---------------------+-------+ | 2019-05-01 00:00:00 | 2021-05-09 15:35:01 | -739 | | 2021-05-03 00:00:00 | 2021-05-09 15:35:01 | -6 | | 2021-03-14 00:00:00 | 2021-05-09 15:35:01 | -56 | | 2020-04-24 00:00:00 | 2021-05-09 15:35:01 | -380 | | 2012-11-09 00:00:00 | 2021-05-09 15:35:01 | -3103 | +---------------------+---------------------+-------+ 19 レコードの更新について 書き方 UPDATE テーブル名  SET カラム名=値,カラム名=値 WHERE 条件; ex) テーブル内 +----+---------+-------+ | id | body | score | +----+---------+-------+ | 1 | Sports | 43 | | 2 | Science | 65 | | 3 | Math | 23 | | 4 | Social | 28 | +----+---------+-------+ 以下を実行 UPDATE posts SET score = score + 20, body = UPPER(body) WHERE score <= 30; +----+---------+-------+ | id | body | score | +----+---------+-------+ | 1 | Sports | 43 | | 2 | Science | 65 | | 3 | MATH | 43 | | 4 | SOCIAL | 48 | +----+---------+-------+ 20 レコードの削除 -- 全削除 DELETE FROM posts; -- 基本は条件をつけることが多い DELETE FROM posts WHERE 条件; ・idでPRIMARY KEYなどを設定している場合、 削除のちのデータの挿入は使われていた次の番号が当てられる もし番号を振り直したかったり、テーブルを初期化する場合は TRUNCATE TABLE テーブル名; ex) +----+---------+-------+ | id | body | score | +----+---------+-------+ | 1 | Sports | 43 | | 2 | Science | 65 | | 3 | Math | 23 | | 4 | Social | 28 | +----+---------+-------+ 下記を実行 DELETE FROM posts WHERE score <=50; SELECT * from posts; TRUNCATE TABLE posts; INSERT INTO posts (body, score) VALUES ('Sports', 67), ('Science', 83), ('Math', 76), ('Social', 79); SELECT * FROM posts; 実行結果 +----+---------+-------+ | id | body | score | +----+---------+-------+ | 2 | Science | 65 | +----+---------+-------+ +----+---------+-------+ | id | body | score | +----+---------+-------+ | 1 | Sports | 67 | | 2 | Science | 83 | | 3 | Math | 76 | | 4 | Social | 79 | +----+---------+-------+ 21 作成日時と更新日時の設定 NOW() 現在時刻を設定する ON UPDATE NOW() アップデート時、その時刻を設定する テーブル作成時以下のようにしておく CREATE TABLE posts ( id INT NOT NULL AUTO_INCREMENT, likes INT, created DATETIME DEFAULT NOW(), updated DATETIME DEFAULT NOW() ON UPDATE NOW(), PRIMARY KEY (id) ); 以下を実行し SELECT id, likes,created,updated FROM posts; SELECT SLEEP(5); UPDATE posts SET likes =99 WHERE id =1; SELECT id, likes,created,updated FROM posts; 実行結果を確認する +----+-------+---------------------+---------------------+ | id | likes | created | updated | +----+-------+---------------------+---------------------+ | 1 | 12 | 2021-05-09 16:27:14 | 2021-05-09 16:27:14 | | 2 | 4 | 2021-05-09 16:27:14 | 2021-05-09 16:27:14 | | 3 | 4 | 2021-05-09 16:27:14 | 2021-05-09 16:27:14 | | 4 | 15 | 2021-05-09 16:27:14 | 2021-05-09 16:27:14 | | 5 | 8 | 2021-05-09 16:27:14 | 2021-05-09 16:27:14 | +----+-------+---------------------+---------------------+ +----------+ | SLEEP(5) | +----------+ | 0 | +----------+ +----+-------+---------------------+---------------------+ | id | likes | created | updated | +----+-------+---------------------+---------------------+ | 1 | 99 | 2021-05-09 16:27:14 | 2021-05-09 16:27:19 | | 2 | 4 | 2021-05-09 16:27:14 | 2021-05-09 16:27:14 | | 3 | 4 | 2021-05-09 16:27:14 | 2021-05-09 16:27:14 | | 4 | 15 | 2021-05-09 16:27:14 | 2021-05-09 16:27:14 | | 5 | 8 | 2021-05-09 16:27:14 | 2021-05-09 16:27:14 | +----+-------+---------------------+---------------------+ 現在時刻と しっかりと更新された日時が設定されている 22 テーブルの操作 主な操作 ALTER TABLE ... ADD ... カラムを追加 ALTER TABLE ... DROP ... カラムを消去 ALTER TABLE ... CHANGE ... カラム名の変更 ALTER TABLE ... RENAME ... テーブル名の変更 以下一例と結果 テーブル名はposts +----+-----------+-------+ | id | subject | score | +----+-----------+-------+ | 1 | Math | 76 | | 2 | Science | 79 | | 3 | History | 35 | | 4 | Listening | 12 | | 5 | Dance | 89 | +----+-----------+-------+ カラムを追加 (SQL文と実行結果をセットで記載) ALTER TABLE posts ADD name VARCHAR(20); +---------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | subject | varchar(140) | YES | | NULL | | | score | int(11) | YES | | NULL | | | name | varchar(20) | YES | | NULL | | +---------+--------------+------+-----+---------+----------------+ ALTER TABLE posts ADD name VARCHAR(20) AFTER id; +---------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(20) | YES | | NULL | | | subject | varchar(140) | YES | | NULL | | | score | int(11) | YES | | NULL | | +---------+--------------+------+-----+---------+----------------+ ALTER TABLE posts ADD name VARCHAR(20) FIRST; +---------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+----------------+ | name | varchar(20) | YES | | NULL | | | id | int(11) | NO | PRI | NULL | auto_increment | | subject | varchar(140) | YES | | NULL | | | score | int(11) | YES | | NULL | | +---------+--------------+------+-----+---------+----------------+ カラムを消去する ALTER TABLE posts DROP subject ; +-------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | score | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+----------------+ カラム名の変更 ALTER TABLE posts CHANGE score points INT; +---------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | subject | varchar(140) | YES | | NULL | | | points | int(11) | YES | | NULL | | +---------+--------------+------+-----+---------+----------------+ テーブル名の変更 ALTER TABLE posts RENAME tests; +-----------------+ | Tables_in_myapp | +-----------------+ | tests | +-----------------+ 23 コメントアウト 1行なら「--」で -- SELECT * FROM posts 複数行なら「/* hogehoge */」 /* INSERT INTO posts (title , body , likes) VALUES ('タイトル','本文',4), ('タイトル2','本文2',5); */
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker-composeでアプリケーションコンテナとデータベースコンテナを立ち上げる

docker-compose.yml でビルドする場合、下記のような形で「depends_on」を記載しコンテナの立ち上げ順序を制御します。 基本的に下記で問題はないのですが、一部の環境で問題が発生することがあります。 調べるといろいろな記事が見つかると思いますが、「コンテナの起動順序」と「コンテナ内のサービスの起動順序」は一致しない ということです。 docker-compose.yml version: '3.7' services: app: build: context: . dockerfile: app.Dockerfile container_name: app privileged: true ports: - 80:80 - 443:443 depends_on: - db db: build: context: . # 公式のMySQLイメージを記載しています dockerfile: db.Dockerfile container_name: db ports: - 3306:3306 上記の記述で「データベース」のコンテナが立ち上げた後に「アプリケーション」のコンテナが起動します。 これはコンテナの起動順序の話であり、データベースコンテナ内のMySQLサービスが起動してからアプリケーションコンテナが立ち上がることを保証しているわけではありません。 ですので、アプリケーションコンテナ起動時にデータベース接続がある場合は正常にアプリケーションコンテナが立ち上がらない場合があります。 アプリケーションコンテナ起動時にデータベース接続が必要な場合はどうすれば良いのか? アプリケーションコンテナのエントリーポイントでデータベースの接続確認をすれば解決します。 app.Dockerfile # 構築処理 ... # エントリーポイントでMYSQLのサービスの確認をします # ホスト名は「データベース」のコンテナ名、その他 IDとパスワードは root で作成していることが前提になります # 下記のループはmysqlに接続をし、接続できなかったら 1秒間停止 して接続できるようになるまで再実行します。 RUN { \ echo '#!/bin/bash'; \ echo "while true; do if [ -z \"\$(exit | mysql -h db -u root -proot 2>&1 > /dev/null)\" ]; then break; else sleep 1; fi done"; \ # データベース接続が必要な処理やサービス立ち上げを記載 } > /usr/local/bin/app.sh ENTRYPOINT ["/usr/local/bin/app.sh"] ※コンテナ開発時には注意しましょう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む