• ベストアンサー

SQLiteでINSERT OR UPDATE

SQLiteにはREPLACE文がありますが、これを使うと、例えばn,c1,c2,c3フィールドがあるデータsampleに対して「replace into sample (n,c2) values (1,1)」を実行すると、c1とc3はnull値になってしまいます。 一部のSQLデータベースで用意されている「INSERT OR UPDATE」のように、行が存在すれば対象のフィールドのみを書き換え(それ以外のフィールドの内容は維持)、存在しなければ行を追加する構文を作ることは可能でしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.1

SQLiteでは、insert or replace しかないけど select文からの入力とサブクエリは使えるから replace into [table_name] (n,c1,c2,c3) select x.n, org.c1, x.c2, org.c3 from (select 1 as n, 1 as c2 ) as x left join [table_name] as org on x.n=org.n ; n がprimary key または uniqueの前提で1行書き換えまたは、新規挿入。

関連するQ&A

  • SQLiteをhtmlでの表示

    sqliteで <?php // 変数の初期化 $db = null; $sql = null; $res = null; $row = null; $db = new SQLite3("test.db"); // データの取得 $sql = 'SELECT * FROM human where sex="男"'; $res = $db->query($sql); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>SQLite テスト</title> </head> <body> <?php while( $row = $res->fetchArray() ) { echo '<p>' . $row[0] . '</p>'; } ?> </body> </html> こちらのphpを実行したのですがidだけが表示されてしまいます。 idに対応するテーブルの行はあっています。 対応するname,age等の表示もさせたいのですがどうすればいいですか? いかtest.dbのhumanテーブルです。 BEGIN TRANSACTION; CREATE TABLE IF NOT EXISTS "human" ( "id" INTEGER NOT NULL, "name" TEXT NOT NULL, "sex" TEXT NOT NULL, "age" INTEGER NOT NULL, "prefecture" TEXT, "country" TEXT NOT NULL, PRIMARY KEY("id") ); INSERT INTO "human" VALUES (1,'中村静香','男',48,'千葉','japan'); INSERT INTO "human" VALUES (2,'中村ゆり','女',45,'埼玉','japan'); INSERT INTO "human" VALUES (3,'本田翼','女',22,'','japan'); INSERT INTO "human" VALUES (4,'本田望結','男',16,'東京','japan'); INSERT INTO "human" VALUES (5,'綾瀬はるか','女',34,'東京','japan'); INSERT INTO "human" VALUES (6,'中村アン','男',38,'','usa'); INSERT INTO "human" VALUES (7,'広瀬アリス','女',26,'東京','japan'); INSERT INTO "human" VALUES (8,'有村架純','男',31,NULL,'usa'); INSERT INTO "human" VALUES (9,'長澤まさみ','女',29,NULL,'uk'); INSERT INTO "human" VALUES (10,'有村藍里','男',18,'埼玉','japan'); COMMIT;

    • ベストアンサー
    • PHP
  • sqliteについて質問があります。

    sqliteについて質問があります。 db browser for sqlite でテーブルを作成したのですが、これをhtmlやphpなどを使いweb上で利用したいです。 例えば、ユーザーが”男”を選択したら”男”のデータ一覧が表示されるようにしたいのですがどうプログラムすればいいですか? 作れたファイルはtest.dbです。 (test.dbは開けませんでしたので以下、test.dbのhumanテーブルです。) BEGIN TRANSACTION; CREATE TABLE IF NOT EXISTS "human" ( "id" INTEGER NOT NULL, "name" TEXT NOT NULL, "sex" TEXT NOT NULL, "age" INTEGER NOT NULL, "prefecture" TEXT, "country" TEXT NOT NULL, PRIMARY KEY("id") ); INSERT INTO "human" VALUES (1,'中村静香','男',48,'千葉','japan'); INSERT INTO "human" VALUES (2,'中村ゆり','女',45,'埼玉','japan'); INSERT INTO "human" VALUES (3,'本田翼','女',22,'','japan'); INSERT INTO "human" VALUES (4,'本田望結','男',16,'東京','japan'); INSERT INTO "human" VALUES (5,'綾瀬はるか','女',34,'東京','japan'); INSERT INTO "human" VALUES (6,'中村アン','男',38,'','usa'); INSERT INTO "human" VALUES (7,'広瀬アリス','女',26,'東京','japan'); INSERT INTO "human" VALUES (8,'有村架純','男',31,NULL,'usa'); INSERT INTO "human" VALUES (9,'長澤まさみ','女',29,NULL,'uk'); INSERT INTO "human" VALUES (10,'有村藍里','男',18,'埼玉','japan'); COMMIT;

    • ベストアンサー
    • PHP
  • sqlite結果の非表示

    sqliteで質問があります。humanテーブルにid,name,sex,age,prefecture,country,image, のカラムがあるのですが、id,name ,sexはデータベース&webページ上ではいるので残したいのですが 表示をしたくありません。 どうすればユーザーに見えないようにできますか? 以下、htmlコードです <?php // 変数の初期化 $db = null; $sql = null; $res = null; $row = null; $db = new SQLite3("test.db"); // データの取得 $sql = 'SELECT * FROM human where country="japan"'; $res = $db->query($sql); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=320, height=480, initial-scale=1.0, minimum-scale=1.0, maximum-scale=2.0, user-scalable=yes" /> <title>SQLite テスト</title> </head> <body> <h1>php の練習</h1> <div class="human"> <ul><?php while( $row = $res->fetchArray() ) { echo '<a href="https://yahoo.co.jp" target=_brank>'. '<li>' . $row[0] . '<span>' , $row[1].'<span>', $row[2].'<span>',$row[3].'<span>', $row[4]. '<span>', $row[5].'<span>' ,' $row[6]. '</li>'. '</a>' ; } ?></ul> </div> </body> </html> 以下、humanテーブルです BEGIN TRANSACTION; CREATE TABLE IF NOT EXISTS "human" ( "id" INTEGER NOT NULL, "name" TEXT NOT NULL, "sex" TEXT NOT NULL, "age" INTEGER NOT NULL, "prefecture" TEXT, "country" TEXT NOT NULL, "image" TEXT, PRIMARY KEY("id") ); INSERT INTO "human" VALUES (1,'中村静香','男',48,'千葉','japan','image/t1.jpg'); INSERT INTO "human" VALUES (2,'中村ゆり','女',45,'埼玉','japan','image/t2.jpg'); INSERT INTO "human" VALUES (3,'本田翼','女',22,'','japan','image/t3.jpg '); INSERT INTO "human" VALUES (4,'本田望結','男',16,'東京','japan',NULL); INSERT INTO "human" VALUES (5,'綾瀬はるか','女',34,'東京','japan',NULL); INSERT INTO "human" VALUES (6,'中村アン','男',38,'','usa',NULL); INSERT INTO "human" VALUES (7,'広瀬アリス','女',26,'東京','japan',NULL); INSERT INTO "human" VALUES (8,'有村架純','男',31,NULL,'usa',NULL); INSERT INTO "human" VALUES (9,'長澤まさみ','女',29,NULL,'uk',NULL); INSERT INTO "human" VALUES (10,'有村藍里','男',18,'埼玉','japan',NULL); COMMIT;

    • ベストアンサー
    • PHP
  • SQLite:項目が存在しない場合のみINSERT

    SQLiteのテーブル内にunique属性を持つフィールドがあります。このフィールドと同名の内容を追加するとエラーが返りますが、SQLiteを呼び出すプログラム側で逐一そのエラーを例外処理しているため、プログラムとしては効率が悪いです。「(If not exist (...) insert ...のような)もしこの項目内容が存在しなければフィールドを追加する」という処理をSQLのクエリ文で完結させたいのですが、このようなことはできますでしょうか。

  • sqliteの表示

    データベースについて質問があります。 例えば、humanテーブルにsexというカラムがあり、 そのカラム(男)のみをhtmlページに10個づつ表示し、 2ページには以前までに表示した10個以外の小さい順に10個表示し 3ページには以前までに表示した20個以外の小さい順に10個表示し 4ページ目には・・・ という感じで表示したいのですがどのように書けばいいのですか? 以下、humanテーブル BEGIN TRANSACTION; CREATE TABLE IF NOT EXISTS "human" ( "id" INTEGER NOT NULL, "name" TEXT NOT NULL, "sex" TEXT NOT NULL, "age" INTEGER NOT NULL, "prefecture" TEXT, "country" TEXT NOT NULL, PRIMARY KEY("id") ); INSERT INTO "human" VALUES (1,'中村静香','男',48,'千葉','japan'); INSERT INTO "human" VALUES (2,'中村ゆり','女',45,'埼玉','japan'); INSERT INTO "human" VALUES (3,'本田翼','女',22,'','japan'); INSERT INTO "human" VALUES (4,'本田望結','男',16,'東京','japan'); INSERT INTO "human" VALUES (5,'綾瀬はるか','女',34,'東京','japan'); INSERT INTO "human" VALUES (6,'中村アン','男',38,'','usa'); INSERT INTO "human" VALUES (7,'広瀬アリス','女',26,'東京','japan'); INSERT INTO "human" VALUES (8,'有村架純','男',31,NULL,'usa'); INSERT INTO "human" VALUES (9,'長澤まさみ','女',29,NULL,'uk'); INSERT INTO "human" VALUES (10,'有村藍里','男',18,'埼玉','japan'); INSERT INTO "human" VALUES (11,'吉岡里穂','男',22,'京都','japan'); INSERT INTO "human" VALUES (12,'広瀬すず','男',32,'大阪','japan'); INSERT INTO "human" VALUES (13,'木村綾乃','男',15,'大阪','japan'); INSERT INTO "human" VALUES (14,'篠原涼子','女',45,'京都','japan'); INSERT INTO "human" VALUES (15,'井上真央','男',26,'','uk'); INSERT INTO "human" VALUES (16,'波留','男',19,'埼玉','japan'); INSERT INTO "human" VALUES (17,'柴咲コウ','女',46,'','usa'); INSERT INTO "human" VALUES (18,'米倉涼子','男',44,NULL,'usa'); INSERT INTO "human" VALUES (19,'桐谷美玲','男',32,'千葉','japan'); INSERT INTO "human" VALUES (20,'仲間由紀恵','男',48,'東京','japan'); COMMIT;

    • ベストアンサー
    • PHP
  • INSERTとWHEREについて

    このようなデータベースがあるのですが、INSERT文を入れるとエラーになってしまいます。 +------+----------+----------------+----------+ | id | name | osusume | review | +------+----------+----------------+----------+ | 1 | エイリアン   | NULL | おもしろい | | 2 | スパイダーマン | NULL | NULL  | +------+----------+----------------+----------+ insert into movie(name,osusume,review) values('名無し',5,'つまらない') where id=2; 当たっているように思えるのですが、どこが間違っているのでしょうか??ご教示、お願いいたします。 ちなみにphpではこのようにデータベースに追記するつもりです。 $sql = <<<EOS insert into movie ( name, osusume, review ) values ( '$name', $osusume, '$review' ) WHERE id=2 EOS;

    • ベストアンサー
    • MySQL
  • 一括でINSERTする方法(PL/SQL)

    PL/SQLを利用して、下記3つのSQLを一括でinsertしたいと思います。 (値は、任意でありません。) PL/SQLに関して、初心者なので、どのように記述してよいか 分かりません。 サンプル的なソースを用いて解説して頂けるとありがたいです。 (1)INSERT INTO tb1(列1, 列2) VALUES('値1','値2') (2)INSERT INTO tb1(列1, 列2) VALUES('値3','値4') (3)INSERT INTO tb1(列1, 列2) VALUES('値5','値6')

  • SQLiteのLike句で抽出できない

    SQLiteのLike句で抽出できないレコードがあります。 原因についてご教授いただけますでしょうか。 以下、操作手順になります。 ■データベースの作成 C:\>sqlite3.exe member.db SQLite version 3.7.15.2 2013-01-09 11:53:05 Enter ".help" for instructions Enter SQL statements terminated with a ";" ■テーブルの作成、レコードの追加 sqlite> create table t_member(name text, age integer); sqlite> insert into t_member values('山田一郎', 25); sqlite> insert into t_member values('田中次郎', 35); sqlite> insert into t_member values('鈴木三郎', 45); ■検索 sqlite> select * from t_member where name like '%一郎'; 山田一郎|25 sqlite> select * from t_member where name like '%次郎'; 田中次郎|35 sqlite> select * from t_member where name like '%三郎'; sqlite> 三郎だけが検索条件に適合しないのは何故でしょうか。 よろしくお願いします。

  • [ADO.NET]Accessの日付型にデータをInsertするには?

    言語はVB.NETでDBはAccess2003、OleDbで接続をしています。 テーブルに日付型のフィールドがあるのですが、 SQL文でInsertしようとすると、 System.Data.OleDb.OleDbException: 更新可能なクエリであることが必要です。 という例外がスローされます。 SQL文としては、 INSERT INTO TEST_TABLE (name,updatetime) VALUES ('テスト',DateValue('2006/12/11 18:00:00')); というような構文になっています。 初歩的な不明点ですが、ご教授お願いします。

  • JDBC:ODBCでaccess db にデータをInsertするとき、構文エラーがでました

    insert into InMoneys(Source,Money) values('1',99) java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] INSERT INTO ステートメントの構文エラーです。

    • ベストアンサー
    • Java