2

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

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

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

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

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

ありがとう、

ショーン

4

3 に答える 3

6

これはうまくいかないということですか?

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")

これは機能しますが、他の値の"周りはエスケープされた形式に含まれており、sqllite はそれを列名としてではなく式として認識する必要があります。

dothquery("INSERT INTO $tablename (c1, c2, ... , cn)
        SELECT (c1, c2, ..., \"othervalue\", ... , cn) FROM $tablename")
于 2009-06-30T19:32:38.217 に答える
0

文字列が で囲まれていることを確認してください'singlequotes'。二重引用符よりも SQL クエリで文字列を引用する方がうまく機能することがわかりました。それらもエスケープされていることを確認してください。

于 2009-06-30T19:36:32.703 に答える
0

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

  1. SQL インジェクション攻撃を防ぎます。
  2. ' と " について心配する必要はありません。引用符を引用したり、引用符をエスケープしたりする必要はもうありません。
  3. パラメータを使用する場合、sqlite はすべての sql ステートメントを再解析する必要がないため、高速です。(パフォーマンスの例については、このリンクを参照してください。sqlite と c# で「'」の問題を回避するにはどうすればよいですか? )。
于 2009-07-01T07:39:49.597 に答える