質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

3回答

3251閲覧

レコードが存在しないときだけINSERTしたい

asahiko123

総合スコア43

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2021/08/05 03:58

前提・実現したいこと

WEBアプリケーションを制作していますが、アプリが起動するたびにテーブルのレコードが増えてしまう状態を
解消したいです。
イメージ説明

該当のソースコード

schema.sql

CREATE TABLE IF NOT EXISTS WORK_TYPE( id INT NOT NULL, type VARCHAR NOT NULL );

data.sql

INSERT INTO `WORK_TYPE` VALUES (1,'テスト'), (2,'コーディング'), (3,'要件定義'), (4,'ミーティング');

試したこと

INSERT INTO なので起動するたびにテーブルに挿入されてしまうんだろう、というところまでは分かりました。
そこで、「テーブルにレコードが存在する場合は挿入しない」という記述をしたいのですが、以下を実行すると
エラーが発生します。

INSERT INTO `WORK_TYPE` ( `id` ,`type` ) SELECT (1,'テスト'), (2,'コーディング'), (3,'要件定義'), (4,'ミーティング') FROM dual WHERE NOT EXISTS ( SELECT `id` FROM `WORK_TYPE` WHERE `type` = 'テスト' OR `type` = 'コーディング' OR `type` = '要件定義' OR `type` ='ミーティング' )

イメージ説明

「列番号が一致しない」とありますが、どのように修正すべきでしょうか?
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

Spring Tool Suite 4-4.10.0.RELEASE
H2 DATABASE
MySQL

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YT0014

2021/08/05 10:34

H2 DatabaseとMySQLをご提示いただいていますが、ご提示頂いたSQLは、どちらのデータベースで試されているのでしょうか? それとも、H2 DatabaseでもMySQLでも、問題なく動くSQLが必要なのでしょうか?
guest

回答3

0

同じレコードが増えてほしくないならもっと手っ取り早くWORK_TYPEidをPKにしてINSERT IGNOREを使うという手もありますね。
https://hit.hateblo.jp/entry/MYSQL/SQL/IGNORE

投稿2021/08/05 04:55

編集2021/08/05 04:56
S.Percentage

総合スコア283

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

SQL

1SELECT 2 (1,'テスト'), 3 (2,'コーディング'), 4 (3,'要件定義'), 5 (4,'ミーティング') 6FROM dual

この部分が構文エラーになっています。やりたいことを考えると、この部分を以下のようにするとよいと思います。

SQL

1SELECT `id`, `type` 2FROM ( 3 SELECT 1 AS `id`, 'テスト' AS `type` FROM dual 4 UNION ALL SELECT 2 AS `id`, 'コーディング' AS `type` FROM dual 5 UNION ALL SELECT 3 AS `id`, '要件定義' AS `type` FROM dual 6 UNION ALL SELECT 4 AS `id`, 'ミーティング' AS `type` FROM dual 7) W

投稿2021/08/05 04:34

neko_the_shadow

総合スコア2230

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asahiko123

2021/08/06 04:13

回答ありがとうございました。無事意図どおり動かせました。
guest

0

そもそも以下の SQL って動きますか?

sql

1SELECT 2 (1,'テスト'), 3 (2,'コーディング'), 4 (3,'要件定義'), 5 (4,'ミーティング') 6FROM dual

※ MySQL に明るくないので もし正しい構文なのだったらごめんなさい

http://sqlfiddle.com/ で流してみたらエラーになったので

Operand should contain 1 column(s)


複数のダミーレコードを返したい場合は union all とかかなと思いますけど どうでしょうか

sql

1SELECT 1 as id, 'テスト' as type FROM dual union all 2SELECT 2 as id, 'コーディング' as type FROM dual union all 3SELECT 3 as id, '要件定義' as type FROM dual union all 4SELECT 4 as id, 'ミーティング' as type FROM dual

投稿2021/08/05 04:22

編集2021/08/05 04:23
sk_3122

総合スコア1126

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問