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

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

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

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

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

1016閲覧

SQL 文法エラー 理由が分からない

koko122102

総合スコア39

MySQL

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

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2022/12/04 08:56

編集2022/12/05 06:49

前提

javaとmysqlを使って勤怠管理及び社員の情報を格納するシステムを作っています。
社員の情報を削除するプログラムを作成したのですがエラーが出ました。
しかし、WHERE文以外全く同じSQL文をA5:SQL mk-2 に入力したところ動きました。

実現したいこと

・文法エラーを訂正しプログラムが動くようにしたい。

発生している問題・エラーメッセージ

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INNER JOIN employee_pass b ON a.id = b.id LEFT OUTER JOIN employee_career c ' at line 1

該当のソースコード

java

1 2public void doDelete(int id) { 3 4 try { 5 Class.forName(DRIVER_NAME); 6 }catch(ClassNotFoundException e) { 7 e.printStackTrace(); 8 } 9 10 Connection con = null; 11 PreparedStatement ps = null; 12 boolean flg = true; 13 14 try { 15 16 con = DriverManager.getConnection(JDBC_URL,USER_ID,USER_PASS); 17 con.setAutoCommit(false); 18 19 StringBuffer buf = new StringBuffer(); 20 21 buf.append(" DELETE"); 22 buf.append(" FROM "); 23 buf.append(" employee_info a "); 24 buf.append(" INNER JOIN employee_pass b ON "); 25 buf.append(" a.id = b.id "); 26 buf.append(" LEFT OUTER JOIN "); 27 buf.append(" employee_career c ON a.id = c.id "); 28 buf.append(" INNER JOIN "); 29 buf.append(" division d ON c.division_id = d.id "); 30 buf.append(" INNER JOIN "); 31 buf.append(" branch e ON c.branch_id = e.id "); 32 buf.append(" WHERE "); 33 buf.append(" a.id = ? "); 34 35 36 ps = con.prepareStatement(buf.toString()); 37 ps.setInt(1, id); 38 39 40 41 ps.executeUpdate(); 42 System.out.println("削除成功"); 43 44 45 }catch(SQLException e) { 46 e.printStackTrace(); 47 flg = false; 48 System.out.println("削除失敗"); 49 }finally{ 50 51 if (ps != null) { //接続が確認できている場合のみ実施 52 try { 53 ps.close(); //接続の解除 54 } catch (SQLException e) { 55 e.printStackTrace(); 56 } 57 } 58 59 //Connectionオブジェクトの接続解除 60 if (con != null) { //接続が確認できている場合のみ実施 61 try { 62 con.close(); //接続の解除 63 } catch (SQLException e) { 64 e.printStackTrace(); 65 } 66 } 67 } 68 69 } 70

以下が使用テーブルの概要です

SQL

1CREATE TABLE EMPLOYEE_INFO( 2 ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY COMMENT "ID", 3 NAME VARCHAR(10) NOT NULL COMMENT "名前", 4 AGE INT NOT NULL COMMENT "年齢", 5 BIRTH DATE NOT NULL COMMENT "生年月日", 6 GENDER INT NOT NULL COMMENT "性別" 7 8 9); 10 11CREATE TABLE EMPLOYEE_CAREER( 12 ID INT NOT NULL PRIMARY KEY, 13 STARTING_DATE DATE NOT NULL COMMENT "入社日", 14 DIVISION_ID INT NOT NULL COMMENT "所属部署", 15 RETIRERING_DATE DATE COMMENT "退社日", 16 BRANCH_ID INT NOT NULL COMMENT "所属支店" 17); 18 19CREATE TABLE DIVISION( 20 21 ID INT NOT NULL PRIMARY KEY, 22 DIVISION_NAME VARCHAR(10) NOT NULL COMMENT "部署" 23 24); 25 26CREATE TABLE BRANCH( 27 28 ID INT NOT NULL PRIMARY KEY, 29 BRANCH_NAME VARCHAR(10) NOT NULL COMMENT "支店" 30 31); 32 33CREATE TABLE EMPLOYEE_PASS( 34 ID INT NOT NULL PRIMARY KEY, 35 PASSWORD VARCHAR(30) NOT NULL COMMENT "パスワード"); 36 37INSERT INTO EMPLOYEE_INFO( 38 NAME, AGE, BIRTH, GENDER 39 )VALUES( 40 "MONA", 25, "1997-05-12", 2 41 ) 42 43INSERT INTO EMPLOYEE_CAREER( 44 ID, STARTING_DATE, DIVISION_ID, BRANCH_ID 45 )VALUES( 46 1, "2020-11-04", 1, 3 47 );

試したこと

・引数のidに数値がちゃんと入力されているかを確認。
・テーブル名などのタイポを確認。

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

eclipse Version: 2021-12 (4.22.0)
MySQL Ver 8.0.29 for Win64 on x86_64 (MySQL Community Server - GPL)

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

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

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

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

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

yuma.inaura

2022/12/04 09:00

具体的にどんなSQLが発行されているんでしょう? SQL全体を書いてほしいです
Orlofsky

2022/12/04 11:14

質問は修正できます。 SQLで使っているテーブルのCREATE TABLE文と各テーブルのデータを何件かINSERT文で追記してください。 DELETE文の書き方を参考にしたURLも提示すると良いかと。
dameo

2022/12/04 12:55

あ、よく読んだら複数テーブルの話が書いてありましたね。 create table A(value int); create table B(value int); delete A, B from A inner join B on A.value=B.value; こんな感じで対象テーブルをfromの前に並べるみたいです。
koko122102

2022/12/05 06:47

みなさまご丁寧に返信していただき誠にありがとうございます。 こちらDELETE の後に削除するテーブルのエイリアスを付けたところエラーは無くなりました。 ただ、対象テーブルの情報は削除されない状況に陥りました。A5:SQL mk-2 に同じ分を入れたら作動しテーブルから情報が消されました。 重ね重ねで恐れ入りますが、原因と改善策をご教示いただけないでしょうか。
dameo

2022/12/05 06:57

commitしてないからでは?
guest

回答2

0

自己解決

commitを行っていなかった。

投稿2023/04/02 08:29

koko122102

総合スコア39

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

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

0

結合してdelete する場合、delete対象テーブルはエイリアスで指定するのですよね。
なので、少なくとも以下のようになるのではないでしょうか。

DELETE a
FROM
employee_info a
・・・あとは続く

投稿2022/12/04 15:05

sooni

総合スコア51

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

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

dameo

2022/12/04 23:45

補足です。 alias指定である必要はないですが、aliasを宣言できるのはfrom句の後だけで、FROM句の前はaliasの指定が可能、という話のようです。再掲しておきます。 https://dev.mysql.com/doc/refman/8.0/en/delete.html ※SQL標準ではなく、MySQL/MariaDBの独自文法です
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問