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

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

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

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1784閲覧

SQLiteで、レコードがあれば更新、無ければ新規挿入したい

atRhod

総合スコア10

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/11/15 01:59

概要

Node.jsにて書籍情報を管理するデータベースをSQLite3にて取り扱っており、書籍一覧のテーブル「books」内に書籍1冊ごとに1つのレコードが割り当てられています。
レコードが重複しているかどうかはカラム「ID」で管理しています。

実現したいこと

「重複する書籍レコードがあればそのレコードを更新し、重複する書籍レコードが無ければ新規レコードを作成する」機能を作成していますが、新規作成のコードをうまく動作させることが出来ず困っています。

試したこと

更新するコードは下記のように記述して正しく動作しました。更新のための情報は配列「items[]」に入っています。

JavaScript

1 db.serialize(()=>{ 2 // 1 既にテーブルにカラム「ID」がある場合、レコードを更新する 3 const up_data = db.prepare('UPDATE books SET RELEASE = ?, TITLE = ?, PRICE = ?, URL = ?, IMAGE_URL = ? WHERE ID = ?'); 4 up_data.run( 5 //更新される情報 6 items['ReleaseDate'],//発売日の更新 7 items['Title'],//書籍名の更新 8 items['Price'],//価格の更新 9 items['URL'], //URLの更新 10 items['imageURL'],//画像のURLの更新 11 //検索用の要素 12 items['ID'],//IDの一致 13 ); 14 up_data.finalize();//Prepareオブジェクトを閉じる 15    });

一方で、IDの不一致を確認して新規レコードを追加する下記コードはエラーが出ており、動作しない状況です。

JavaScript

1    db.serialize(()=>{ 2 const in_data = db.prepare('INSERT INTO books VALUES(?,?,?,?,?) WHERE NOT EXISTS ( SELECT * FROM books WHERE ID = (?)'); 3 in_data.run( 4 //挿入される情報 5 items['ReleaseDate'],//発売日の更新 6 items['Title'],//書籍名の更新 7 items['Price'], //PRICEの更新 8 items['URL'], //URLの更新 9 items['imageURL'],//画像のURLの更新 10 //検索用の要素 11 items['ID'],//IDの不一致 12 ); 13 } 14 in_data.finalize();//Prepareオブジェクトを閉じる 15 });

#エラー内容

エラー内容は下記の通りです。"WHERE"の近くに構文ミスがあるとのことで、サイト等を参考に構文を修正して試してみましたが一向にエラーが無くならず、情報も少ないため質問させて頂きました。

undefined:0 [Error: SQLITE_ERROR: near "WHERE": syntax error Emitted 'error' event on Statement instance at: ] { errno: 1, code: 'SQLITE_ERROR' }

よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

INSERT 構文では、WHEREは利用できません。

表題の要件を満たすものとして、SQLite3には、INSERT OR REPLACEという構文がありますので、こちらを利用するのはいかがでしょうか?
INSERT OR REPLACE

あるいは、javascriptからSELECT構文で、IDに該当するレコードの有無を確認して、UPDATEとINSERTを呼び分ける手段もあります。

投稿2020/11/15 02:52

YT0014

総合スコア1708

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

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

atRhod

2020/11/15 03:26

YT0014様 回答頂きありがとうございます。挿入か更新を自動で実行する構文があるんですね。試してみようと思います。
atRhod

2020/11/15 05:46

教えていただいたサイトを参考に実装したところ、動作させることが出来ました。 データは日付で変わっていくので、うまく新規データが読み込まれる or 更新されるか様子見したいと思います。 ご回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問