سكليتي:نسخ كافة القيم من الصف السابق مع استبدال واحد

StackOverflow https://stackoverflow.com/questions/1065534

سؤال

باستخدام سكليتي كنت بحاجة إلى نسخ ما يقرب من جميع من القائمة صف من الجدول إجراء تغيير على عمود واحد و إدراج صف جديد في الجدول.شيء تقريبا ،

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

حاولت استبدال بعض القيمة ci إلى قائمة تحديد الأعمدة.يعمل هذا إذا كانت القيمة تعويم أو عدد صحيح ، ولكن ليس إذا كانت السلسلة.إذا كانت القيمة سلسلة, سكليتي تفسر على أنها اسم العمود ، والتي بطبيعة الحال لا موجودة و أحصل على خطأ.

يمكنني كتابة التعليمات البرمجية لتنفيذ هذه العملية ، ولكن كنت أتمنى أن تفعل ذلك في استعلام واحد.

إن من الأهمية ، أنا حاليا الترميز في tcl.

شكرا

شون

هل كانت مفيدة؟

المحلول

هل يعني هذا لا يعمل؟

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

وكيف حالك إنشاء الاستعلام الخاص بك؟

وشبة الكود مثلا هذا لن يعمل كما هو تفسير othervalue كما اسم العمود

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

وبينما يعمل هذا، لأن " حول othervalue مدرجة في شكل نجا ومن ثم sqllite يجب أن تعترف بأنها التعبير ليس بعد الآن كما اسم العمود

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

نصائح أخرى

تأكد من أنك محاط السلسلة في 'singlequotes'. أجد أنها تعمل على نحو أفضل نقلا عن سلاسل في استعلامات SQL من doublequotes. تأكد من أن يتم هرب هم أيضا.

أنا لا أعرف ما إذا كان tcl يدعم استعلامات بمعلمات أو لا.استخدام استعلامات بمعلمات في سكليتي ثلاث مزايا.

  1. يمنع هجمات حقن sql.
  2. كنت لا داعي للقلق حول ' و ".لا أكثر نقلا من يقتبس أو الهروب من الاقتباس.
  3. وهو أسرع لأن سكليتي لا يجب إعادة التوزيع كل sql عند استخدام المعلمات.(انظر هذا الرابط على أداء سبيل المثال كيف يمكنني الحصول على حول "'" المشكلة في sqlite و c# ؟ ).
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top