DDLとDMLについて
はじめに
今回は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にログインする
- ターミナルでmysqlにログインする。
- 使用するDBを選択する
- 追加するファイルの中身をそのままコピーしてエンターをクリックする
この方法なら1テーブルだけ追加するので、
DROP TABLE IF EXISTS;
これがあっても既存のファイルには影響を与えません。
これを知った私は歓喜しましたwww
最後に
いかがでしょうか?
Dockerを使用している場合はもしかしたら無縁かもしれませんが、もし使用する機会があれば参考程度になれば幸いです。
Discussion