SQLite:前の行からすべての値を 1 回の置換でコピーします
質問
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 つの利点があります。
- SQL インジェクション攻撃を防ぎます。
- 「」や「」については心配する必要はありません。引用符を引用したり、引用符をエスケープしたりする必要はもうありません。
- パラメーターを使用するときに sqlite はすべての SQL ステートメントを再解析する必要がないため、高速になります。(パフォーマンスの例については、このリンクを参照してください) SQLite と C# の「'」問題を回避するにはどうすればよいですか? ).
所属していません StackOverflow