SQLiteでIF NOT EXISTSの使い方

このQ&Aのポイント
  • SQLiteでテーブルの生成時にIF NOT EXISTSを使用する方法や制約について解説します。
  • また、IF NOT EXISTSが使えない場合の回避方法や代替手段についても説明します。
  • dbi:SQLiteでTABLE IF NOTを使用するための設定方法についても紹介します。
回答を見る
  • ベストアンサー

SQLiteでIF NOT EXISTSの使い方

my $dbh = DBI->connect("dbi:SQLite:dbname=$filename","",""); で ' CREATE TABLE "sampleTable1" (' # ' CREATE TABLE IF NOT EXISTS "sampleTable1" (' .'"samplekey1" INTEGER, "samplekey2" INTEGER' .' ); ' だと問題ないのですが、 コメント部分ので 生成しようとすると IF NOT EXISTS をだと NOTのまえがどうのこうのと エラーになるので IF NOT EXISTS は 使えないのでしょうか? SQLiteでIF NOT EXISTSのような使い方がわからないので 接続後に my @names = $dbh->tables; $Miteigi_data = 1; for my $name (@names) { #  テーブル名比較 if ( ($name eq 'sampleTable1') || ($name eq '"sampleTable1"') ) { $Miteigi_data = 0; } } で  テーブル名を確認して あるかないのか変数に代入して置いて  あとから条件文で if ($Miteigi_data) 上のテーブルの生成を行うことにして回避したのですが dbi:SQLiteで TABLE IF NOT が使えるようにするにはどうしたらいいのでしょうか

noname#21216
noname#21216
  • Perl
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

SQLiteは、TABLE IF NOT構文は使えません。 SQLiteで使える構文については参考URLをご覧下さい。

参考URL:
http://www.sqlite.org/lang_createtable.html
noname#21216
質問者

お礼

そこも昨日みたのですが、 よくわからなかったので・・・ 使えないのですか・・・ めんどくさいですが、 ログイン時に $dbh->tables; でテーブル名を抽出して 比較対応しておこうとおもいます ありがとうございました。

関連するQ&A

  • PerlからSQLiteをうまく扱えません

    以下のような感じで、 Perlから、SQliteのデータベースと、そのテーブルを作成し INSERTさせてみるのを組んでみたのですが うまく行かないようです・・・。 何が原因なのかどうすればうまくいくのか、教えていただけないでしょうか。 よろしく御願いします。 #!/usr/bin/perl use DBI; $dbfilename = "./testdb"; &dbcon; $sth = $db->prepare("INSERT INTO user VALUES(\'1\',\'abc\')"); $sth->execute; $sth->finish; &dbuncon; exit; sub dbuncon { $db->disconnect; } sub dbcon { $makedbflag = '0'; unless (-f $dbfilename) { $makedbflag = "1"; } $db = DBI->connect("dbi:SQLite:dbname=$dbfilename","","",); if($makedbflag eq "1") { &dbmaketable; } } sub dbmaketable { $sql = "CREATE TABLE user (id, name);"; $db->do($sql); }

  • PerlでSQLiteのデータテーブルを作成し

    PerlでSQLiteのデータテーブルを作成し、作成したテーブルへデータを追加するようにしたいのですが、 下記のように作成し、実行すると、 テーブルの作成のみ、もしくは、既存のテーブルへのデータの追加のみは可能なのですが、 両方処理させると、テーブルの作成のみされて、作成されたテーブルの中身はカラのままです。 #データベースに接続 $dbh = DBI->connect("dbi:SQLite:dbname=c:\\database\\tyumon.db"); open (DATA,"c.dat"); $data = <DATA>; close(DATA); $data = $data+1; $table = "user"; $table .= $data; #テーブル作成実行 $hst = $dbh->do("CREATE TABLE '$table'(name text,area text,tel text,mail text,jikan text, hoka text)"); #レコードの追加(INSERT文の実行) $st = $dbh->do("insert into '$table' values('$data','$name','$area','$tel','$mail','$jikan','$hoka')"); 「c.dat」には、カウントされた数字が入っています。 テーブル名は「user」+カウント数字で作成しています。 データベースと、CGIの勉強を兼ねて作成しているもので、 根本的な間違いなどあるかもしれません。 どなたか、ご指摘いただければ幸いです。

    • ベストアンサー
    • CGI
  • MySQLのトランザクションについて

    初めて質問します。 今、PerlのDBIを使ってMySQLのトランザクション処理にチャレンジしています。 ところが、rollback処理がうまくできません。 具体的には、 table2 がある状態で下のプログラムを動かすと、 エラーの表示が出るのに、 table1 は作成されました。 何らかのエラーがあれば、どちらも作成されないようにしたいです。 ======================================================= my %sql; $sql{db_name} = "database"; $sql{host} = "localhost"; $sql{user_name} = "user_name"; $sql{password} = "password"; use DBI; my $dbh = DBI->connect('DBI:mysql:'.$sql{db_name}.':'.$sql{host}, $sql{user_name}, $sql{password} ,{RaiseError => 1, PrintError => 0, AutoCommit => 0 }) || &Err(); my $sth; my $re; eval { my $sql_string1 = "create table table1(`id` int);"; my $sql_string2 = "create table table2(`id` int);"; $sth = $dbh->prepare($sql_string1); $re = $sth->execute; $sth = $dbh->prepare($sql_string2); $re = $sth->execute; }; if ($@) { $tag="Err:".$@."\n"; $sth = $dbh->rollback; }else{ $sth = $dbh->commit; } $sth->finish; $dbh->disconnect; ======================================================= 検索して、いろいろいじっても解決しませんでした。 どうかよろしくお願いします。

    • ベストアンサー
    • Perl
  • SQlite

    SQLiteを使って メールを保存するデータベースを作っています。 以下のようになっています。  さらに、 アドレス帳を作りたいのですが 新たにデータベースを開くのか 同じデータベースで別のテーブルを開けばよいのかわかりません。 ご存知の方よろしくお願いします。 また、 C++からSQLiteを扱う上での参考書などもありましたら 教えてください。 rc = sqlite3_open(".\\mailbox\\SQMail.db", &db); if( rc ){ AfxMessageBox("Can't open database:", MB_OK); sqlite3_close(db); return; } rc = sqlite3_exec(db, "create table MailTbl (id INTEGER PRIMARY KEY, attach varchar(20), subject varchar(120),addressfrom varchar(80),addressto varchar(80),date varchar(80),size integer,priority integer, read integer, state integer, alldata blob);", callback, 0, &zErrMsg); if( rc!=SQLITE_OK ){ // AfxMessageBox("SQL error:", MB_OK); sqlite3_free(zErrMsg); }

  • NOT INをNOT EXISTSで書き直したい

    こんにちは。SQLでNOT INが実行速度が遅いため、EXISTSで書き直したいのですが、思っている結果がでません。 SQLのどこが間違っているかお教え頂けませんでしょうか? ■ ・テーブル名:R_TABLE ・フィールド:id データ: id(ユニークではない) 001 002 003 003 003 007 008 009 ■ ・テーブル名:P_Master ・フィールド:id データ: id(ユニーク) 001 002 003 ■やりたい事 R_TABLEのデータを条件によって削除したい。 条件はP_MASTERに無いR_TABLEの行を削除したいです。 ■欲しい結果 R_TABLE 001 002 003 003 003 ■書いたSQL DELETE FROM R_TABLE WHERE R_TABLE.id NOT IN (SELECT R_TABLE.id FROM R_TABLE INNER JOIN P_MASTER ON R_TABLE.id = P_MASTER.id) これは正しい結果がでました。 書きなおしたSQL DELETE FROM R_TABLE WHERE R_TABLE.id WHERE NOT EXISTS (SELECT R_TABLE.id FROM R_TABLE INNER JOIN P_MASTER ON R_TABLE.id = P_MASTER.id) 結果はR_TABLEから何も消されていませんでした。 どこを修正すれば正しい結果が得られるでしょうか? 副問い合わせで、R_TABLEとP_MASTERのINNER JOINの結果が得られ、R_TABLEからINNER JOINに含まれないデータ削除しろという命令だと思っていたのですが違うみたいです。 どこを修正すればよろしいでしょうか? よろしくお願いします。

  • SQLiteのデータベースについて

    PHP初心者です。以下のSQLiteより作成するデータベースについて教えてください。 $DB = sqlite_open('db1.db'); $sql="create table tables(id integer ,name,texts)"; $result=sqlite_query($db,$SQL); 上記、プログラムにより、同ディレクトリに、db1.dbが作成されますが、このデータベース情報はどのようにして、閲覧するのでしょうか(MS-ACCESS、SQLのように簡単に閲覧できないのか)。主キーやテーブルの名前またはフィールドの名前の変更、データ一覧閲覧などどのようにするのでしょうか。 環境は、Windows環境で、PHP4を使用しております。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • SQLiteは明示的に閉じる

    いつもお世話になっております。 androidアプリの開発を行っています。 まだまだ勉強不足なのですが、ご教示お願いいたします。 下記のようにSQLiteでデータの操作をしています。 activityは詳細画面のような感じで、違うnameで複数アクセスされます。 close()を実行すると、closeしていません。みたいなエラーがでて、 close()を実行しないと、selete()が実行できなくなってしまいます。 activity.java ------------------------------ SQLiteHelper dbHelper = new SQLiteHelper(getApplicationContext()); SQLiteDatabase db = dbHelper.getWritableDatabase(); dbHelper.select(db); database.java ------------------------------ public class DatabaseHelper extends SQLiteOpenHelper { public SQLiteHelper(Context context) { super(context, DATABASE_NAME, null, 1); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + TABLE_NAME + " (_id integer primary key autoincrement, name text not null)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db); } public select(SQLiteDatabase db, String name) { String sql = "SELECT * FROM " + TABLE_NAME + " WHERE name=" + name; Cursor cursor = db.rawQuery(sql, null); // ↓これが原因かと。 db.close(); } } closeは明示的に書かないといけないのでしょうか。 分かりずらいかもしれませんが、エラーを出さない方法をご教示お願いいたします。 よろしくお願いいたします。

  • SQLite3のSELECT文で変数を含めたい

    初めまして。 RubyでSQLite3を使ってデータベースを作っています。 作成したデータベースが↓です。 id | name | age ---------------------------- yamada01 | 山田 太郎 | 20 sato01 | 佐藤 花子 | 25 コマンドプロンプトからidを入力して、idのデータを呼び出したいのですが、うまくいきません。 dbh = DBI.connect('DBI:SQLite3:book.db') key = gets.chomp sth = dbh.execute("select * from book where id = 'key';") 三行目の変数keyをyamada01にすると正しく出力されます。 どのように変えれば正しく出力されるのでしょうか。 ご指導のほど、よろしくお願いいたします。

  • 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
  • yahooウィジェットのSQLiteに関して

    どうしてもわからず、質問させてください。 INSERTの所で 1 near "[i]" :syntax error と出てしまいます。 配列にはちゃんとデータが入っていることを確認しました。 どこがおかしいのかお分かりになる方すいませんが、お願いします。 またyahooウィジェットのSQLiteはトランザクションは使えるのか知っている方いましたら合わせてお願いいたします。 ▼ソースは以下のようなものです var db = new SQLite(); //オープン db.open( "オーブンファイル名" ); //テーブル存在確認 var result = db.query( "SELECT * FROM sqlite_master WHERE type='table' AND name='テーブル名'" ); if ( result.getRow() == null ) { result.dispose(); db.exec( "CREATE TABLE テーブル名(id int(10),name varchar(255))" ); FileRead( "ファイル読み込み" ); for (var i in lineArray) { alert(lineArray[i]); db.exec( "INSERT INTO テーブル名(id, name) VALUES(i, lineArray[i])" ); } } db.close;

専門家に質問してみよう