🎓

DDLとDMLについて

2024/12/07に公開

はじめに

今回はDDLとDMLについて簡単に記載したいと思います。
おそらく多くの会社ではDockerを使用していると思いますが、今回のPJでは前回のPJを引き継ぐ形で行われたので、Dockerを使用しないです。
そのため、データベースを変更するとその度にテーブルを更新しないといけなく、DDLとDMLを使ったことがない私にとっては面倒と思ったり、ファイルの先頭に

DROP TABLE IF EXISTS `テーブル名`;

とあったので、何度既存のローカルデータを削除した事か…
そんな私が無事に開発を進められるようになった方法?をお伝えできればと思います。

環境

React:18
Next:14
PHP:8.3
mysql:8

そもそもDDLとは?

DDLは、データベースの構造を定義するために使用されるコマンド群です。
これには、テーブル、インデックス、ビューなどのデータベースオブジェクトの作成、変更、削除が含まれます。
DDLコマンドは、データベースのスキーマを設定または変更する際に使用されます。

  • CREATE: 新しいテーブルやデータベースオブジェクトを作成する
  • ALTER: 既存のデータベースオブジェクトを変更する
  • DROP: 既存のオブジェクトを削除する
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
);

ALTER TABLE users ADD COLUMN age INT;

DROP TABLE users;

実際に使用している例

DROP TABLE IF EXISTS `qualifications`;

CREATE TABLE `qualifications` (
    `notified_referee_qualification_id` int NOT NULL AUTO_INCREMENT,
    `notification_id` int NOT NULL,
    `referee_qualification_id` int NOT NULL,
    `registered_time` timestamp(6) NOT NULL,
    `registered_user_id` int NOT NULL,
    `updated_time` timestamp(6) NOT NULL,
    `delete_flag` int NOT NULL DEFAULT '0',
    PRIMARY KEY (`notified_referee_qualification_id`),
    FOREIGN KEY (notification_id) REFERENCES t_notifications(notification_id),
    FOREIGN KEY (referee_qualification_id) REFERENCES t_held_referee_qualifications(referee_qualification_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ENCRYPTION='Y';

色々書きましたが、まぁテーブル定義する場所ですかね〜

そもそもDMLとは?

DMLは、データベース内のデータを操作するために使用されるコマンドです。
データの挿入、更新、削除などを行います。
これらのコマンドは、アプリケーションがデータベースと対話する際に頻繁に使用されます。

  • INSERT: テーブルに新しいデータを挿入する
  • UPDATE: テーブルの既存のデータを更新する
  • DELETE: テーブルからデータを削除する
  • SELECT: テーブルからデータを選択する
INSERT INTO users (id, name, email) VALUES (1, 'Taro', 'taro@example.com');

UPDATE users SET name = 'Jiro' WHERE id = 1;

DELETE FROM users WHERE id = 1;

SELECT * FROM users WHERE age > 20;

実際に使用している例

--
-- Dumping data for table `m_organization_class`
--

INSERT INTO m_organization_class (org_class_id, org_class_name, display_order, registered_time, registered_user_id, updated_time, updated_user_id, delete_flag) VALUES (1,'大学',1,'2024-02-29 18:08:33',9999999,'2024-02-29 18:08:33',9999999,0),(2,'高等学校',2,'2024-02-29 18:08:33',9999999,'2024-02-29 18:08:33',9999999,0),(3,'高等専門',3,'2024-02-29 18:08:33',9999999,'2024-02-29 18:08:33',9999999,0),(4,'一般',4,'2024-02-29 18:08:33',9999999,'2024-02-29 18:08:33',9999999,0),(5,'中学',5,'2024-02-29 18:08:33',9999999,'2024-02-29 18:08:33',9999999,0),(6,'中高一貫',6,'2024-02-29 18:08:33',9999999,'2024-02-29 18:08:33',9999999,0);


-- Dump completed

見にくいと思うので、画像でご覧ください。

まぁ要するにデフォルトデータを記載しておく場所みたいな感じですね〜

データをDBに入れる方法

今回のパスbackend/migration
execute_sql_files.shというファイルをmigration配下に設置
execute_sql_files.shの中身
backendに移動して、ターミナルで下記を実行します。
するとフォルダ内の.sqlという拡張子のものは自動的にDBに登録されます。

for file in ./migration/ddl/*.sql; do
    echo "Running $file..."
    mysql -u root データをいれたいDB名 < "$file"
done

for file in ./migration/dml/*.sql; do
    echo "Running $file..."
    mysql -u root データをいれたいDB名 < "$file"
done

新たに1ファイルだけを追加する際には下記のようにmysqlにログインする

  1. ターミナルでmysqlにログインする。
  2. 使用するDBを選択する
  3. 追加するファイルの中身をそのままコピーしてエンターをクリックする

この方法なら1テーブルだけ追加するので、

DROP TABLE IF EXISTS;

これがあっても既存のファイルには影響を与えません。
これを知った私は歓喜しましたwww

最後に

いかがでしょうか?
Dockerを使用している場合はもしかしたら無縁かもしれませんが、もし使用する機会があれば参考程度になれば幸いです。

Discussion