質問

SQLite を使用して、テーブルから既存の行のほぼすべてをコピーし、単一の列を変更して、新しい行をテーブルに挿入する必要があります。おおよそ次のようなもの

INSERT INTO $tablename (c1, c2, ... , cn) 
    SELECT (c1, c2, ... , cn) FROM $tablenam

SELECT 列のリストに値 ci を代入してみました。これは、値が浮動小数点または整数の場合は機能しますが、文字列の場合は機能しません。値が文字列の場合、SQLite はそれを列名として解釈しますが、当然のことながら列名は存在しないため、エラーが発生します。

この操作を実行するコードを作成できますが、1 つのクエリで実行したいと考えていました。

関連性がある場合、私は現在 tcl でコーディングしています。

ありがとう、

ショーン

役に立ちましたか?

解決

あなたは、これは動作しません意味ですか?

INSERT INTO $tablename (c1, c2, ... , cn)
    SELECT (c1, c2, ..., "othervalue", ... , cn) FROM $tablename

どのようにあなたのクエリを構築していますか?

擬似例えばこれは動作しませんothervalueがColumnNameにあると解釈される。

dothquery("INSERT INTO $tablename (c1, c2, ... , cn)
        SELECT (c1, c2, ..., othervalue, ... , cn) FROM $tablename")

othervalue周り"はエスケープ形式に含まれており、その後sqlliteはColumnNameに

としてもはや表現としてそれを認識しなければならないので、これは、作品ながら、
dothquery("INSERT INTO $tablename (c1, c2, ... , cn)
        SELECT (c1, c2, ..., \"othervalue\", ... , cn) FROM $tablename")

他のヒント

あなたは'singlequotes'で文字列を囲まれていることを確認します。私は、彼らは二重引用符よりもSQLクエリ内の文字列を引用のために良い仕事を見つけます。彼らはあまりにもエスケープされていることを確認します。

tcl がパラメータ化されたクエリをサポートしているかどうかはわかりません。sqlite でパラメーター化されたクエリを使用すると、3 つの利点があります。

  1. SQL インジェクション攻撃を防ぎます。
  2. 「」や「」については心配する必要はありません。引用符を引用したり、引用符をエスケープしたりする必要はもうありません。
  3. パラメーターを使用するときに sqlite はすべての SQL ステートメントを再解析する必要がないため、高速になります。(パフォーマンスの例については、このリンクを参照してください) SQLite と C# の「'」問題を回避するにはどうすればよいですか? ).
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top