MySQLにおけるDB作成メモ

データベースを作る

MySQL上にデータベースを作ります。

CREATE DATABASEコマンドを作成します。
今回は、NVD から取得した脆弱性情報を格納するデータベースを作りたいため、「NVD_DB」とします。

-- データベースを作成する CREATE DATABASE IF NOT EXISTS NVD_DB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

CHARACTER SET utf8mb4:4byteのUTF-8
COLLATE utf8mb4_general_ci:UTF-8を使用し、大文字小文字を区別しない

CREATE USERコマンドを作成します。

-- ユーザーを作成する CREATE USER 'ユーザー名'@'%' IDENTIFIED BY 'パスワード';

便宜上1行しか書いていませんが、管理者と作業者の2ユーザー作ります。

CREATE TABLEコマンドを作ります。

-- テーブルを作成する -- CVE情報 -- CVE基本情報 CREATE TABLE IF NOT EXISTS NVD_DB.NVD_CVE_INFO ( cveid VARCHAR(16) PRIMARY KEY, sourceidentifier VARCHAR(128), published TIMESTAMP NOT NULL, lastModified TIMESTAMP, vulnStatus VARCHAR(32), KEY idx_sourceidentifier(sourceidentifier) ) ENGINE=InnoDB COMMENT='CVE情報の基本情報を管理する'; GRANT SELECT, INSERT, UPDATE, DELETE ON NVD_DB.NVD_CVE_INFO TO '管理者ユーザー'@'%'; GRANT SELECT ON NVD_DB.NVD_CVE_INFO TO '作業者ユーザー'@'%';

こちらもサンプルで1テーブルだけ掲載。


コンテナにsqlファイルを配置します。

mac上でsqlファイルを作成したため、まずscpコマンドでRasberryPi上へ転送します。

$ scp ./*.sql ユーザー名@ホスト名.local:/home/ユーザー名/Documents/MySQL create_database.sql 100% 124 25.8KB/s 00:00 create_table.sql 100% 5897 449.9KB/s 00:00 create_user.sql 100% 135 24.2KB/s 00:00

コンテナからはRasberryPi上のディレクトリを参照することはできないため、コンテナの/tmpディレクトリにsqlファイルをコピーします。

docker cp /home/ユーザー名/Documents/MySQL/create_database.sql mysql-rpi:/tmp/create_database.sql docker cp /home/ユーザー名/Documents/MySQL/create_user.sql mysql-rpi:/tmp/create_user.sql docker cp /home/ユーザー名/Documents/MySQL/create_table.sql mysql-rpi:/tmp/create_table.sql

MySQLにログインします。

$ docker exec -it mysql-rpi bash bash mysql -u ユーザー名 -p

ログイン時点で使用するデータベースを確定させたい場合は、mysqlコマンドにてデータベース名を指定します。

$ docker exec -it mysql-rpi bash bash mysql -u ユーザー名 -p データベース名

MySQL上でsqlファイルを実行。

source /tmp/create_table.sql source /tmp/create_user.sql source /tmp/create_database.sql

数回エラーが出ましたが、全部シンタックスエラーだったため割愛。
データベースとテーブルをそれぞれ確認します。

mysql> SHOW DATABASES ; +--------------------+ | Database | +--------------------+ | NVD_DB | | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)

「NVD_DB」が作成されていることが確認できました。

mysql> SHOW TABLES FROM NVD_DB; +------------------+ | Tables_in_NVD_DB | +------------------+ | CONFIGURATION | | CVECHANGE | | CVECHANGE_DETAIL | | DESCRIPTION | | METRICS | | NVD_CVE_INFO | | NVD_CVE_TAG | | REFERENCE | | VENDERCOMMENT | | WEAKNESSE | +------------------+ 10 rows in set (0.00 sec)

PRIMRY KEY と UNIQUE KEY

テーブルを作成する時に必ず意識をするのがプライマリーキー(主キー)です。
プライマリーキーは、テーブルに必ず存在するキーで一意なキーです。MySQLではテーブル作成時に省略した場合は自動的に連番が割り振られます。
私はテーブル設計時には気づいていなかったのですが、複数の項目を組み合わせてプライマリーキーとすることもできるようです。
対して、ユニークキーも、一意でないといけないという点においては変わりありません。大きな違いは、ユニークキーの場合「NULLが許される」点だと思います。また、一つのテーブルに対して複数のユニークキーを持たせることもできます。
私の設計しているテーブルの場合、プライマリーキーだけで用が足せそうなので、あとで修正します。

# プライマリーキーまたはユニークキーが単一項目である場合 # 変数名定義時に PRIMARY KEY や UNIQUE と書けばOK -- 導入済み製品 DROP TABLE NVD_DB.INSTALLED_PRODUCT; CREATE TABLE IF NOT EXISTS NVD_DB.INSTALLED_PRODUCT ( applicationname VARCHAR(256) PRIMARY KEY, productname VARCHAR(256), vendername VARCHAR(128), a_version VARCHAR(64), platform VARCHAR(256), software_type VARCHAR(256), a_edition VARCHAR(128), KEY inx_vendername(vendername), KEY inx_productname(productname), KEY inx_a_version(a_version) ) ENGINE=InnoDB COMMENT='導入済み製品'; # プライマリーキーまたはユニークキーを複数項目組み合わせる場合 # 変数定義後に PRIMARY KEY (変数名、変数名、、、)または UNIQUE KEY (変数名、変数名、、、)とかきます。 DROP TABLE NVD_DB.NVD_CVE_INFO; CREATE TABLE IF NOT EXISTS NVD_DB.NVD_CVE_INFO ( cveid VARCHAR(16), sourceidentifier VARCHAR(128), published TIMESTAMP NOT NULL, lastModified TIMESTAMP, vulnStatus VARCHAR(32), PRIMARY KEY(cveid), UNIQUE KEY(cveid, sourceidentifier), KEY idx_sourceidentifier(sourceidentifier) ) ENGINE=InnoDB COMMENT='CVE情報の基本情報を管理する';

参考サイト

MySQL 8.0 リファレンスマニュアル テーブルの一覧とテーブルに関する情報を取得する

コメント

このブログの人気の投稿

【python】PySide6 におけるウィンドウとかダイアログボックス内のアイテムの自動調整

脆弱性評価システムを作る〜CVSSとは〜

dict型オブジェクトを内包するlistオブジェクトのコピー