 |
ต้องการ insert ข้อมูลลง ตารางครับ สามารถเขียน SQL insert แบบมีเงื่อนไขแบบ ว่า.... |
|
 |
|
|
 |
 |
|
แนะนำว่าให้ทำการปรับปรุงค่าก่อนที่จะ insert ลงไปครับ ... กรณีของคุณพยายามที่จะใช้ function ที่ติดมากับ DB เลย ซึ่งก็อาจจะดีในบางกรณี ....
แต่ถ้าเป็นการเพิ่มข้อมูลลงตารางแบบนี้ โดยต้องการค่า max ออกมาก่อน แล้วบวก 1 เข้าไป และยิ่งเป็นข้อมูลที่สำคัญในการเพิ่มค่า คือต้องเพิ่มไม่ผิดเลย เพราะฉะนั้นจึงควรที่จะต้องทำการเขียน code เพื่อให้ได้ค่าที่ถูกต้อง (พร้อมตรวจสอบค่าก่อนในกรณีที่สำคัญมาก) แล้วจึงค่อยทำการ insert
ในกรณีนี้จึงอาจจะต้องทำ 2 ขั้นตอนครับ คือ
1. หาค่า max ออกมาก่อน จะเป็นด้วยแบบไหนก็แล้วแต่... (อาจจะ select max ออกมาแล้วเก็บเข้าตัวแปร แล้วจึงบวก 1 เข้าไป)
2.เอาค่าที่ได้จากข้อแรกมาใช้ในการ insert
|
 |
 |
 |
 |
Date :
2011-11-23 10:53:53 |
By :
Songkram |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
insert into table_test (fnum,f1,f2,f3)select Max(fnum)+1,'$f1','$f2','$f3' from table_test
function max ในบันทัดข้างบนนี้คือ function ที่ติดมากับ DB (DBF) ใช่หรือไม่...... ถ้าไม่ใช่ งั้นผมก็ไม่เข้าใจว่ามายังไงอ่ะครับ
ขออภัยที่ยังอธิบายไม่ครบ วิธีการของผมก็คือ มีตัวแปรอยู่ตัวนึงที่บอกให้รู้ว่า ค่า max ในปัจจุบันคือเท่าไร... ถ้าอย่างง่ายก็คือ มี table ที่เก็บค่า max เอาไว้นั่นแหละครับ เมื่อมีการ select max จาก table นี้เอาไปใช้เมื่อใด ระบบก็จะทำการ update ค่า max ที่นี่ทันที
การหาค่า max ออกมาก่อนของผมเกิดขึ้นในขั้นตอนเดียวกันกับกระบวนการ insert นั่นแหละครับ
เช่น ผู้ใช้กดปุ่มเพื่อจะ insert ข้อมูล (หรือวิธีไหนก็แล้วแต่) กระบวนงานก็จะไปทำ 2 ขั้นตอนที่ผมว่าเลย (2 ขั้นตอนที่ผมว่าเป็นขั้นตอนย่อยที่ทำงานเบื้องหลังผู้ใช้งาน) เพราะฉะนั้นมันจะทำงานอย่างรวดเร็วจนมีความเป็นไปได้น้อยมากที่จะทำงานพร้อมกันครับ....
แต่ถ้าจำนวนผู้ใช้งานระบบของคุณมีมากเสียจนสามารถกดปุ่มใดๆได้พร้อมกันเปะแล้วล่ะก็.. แนะนำให้ใช้ session เข้ามาควบคุมการทำงานครับ.. ถ้าจะให้อธิบายอีกก็ยาวแน่ และต้องอธิบายไปจนถึงการ commit และ rollback แน่นอน....
ผมใช้วิธีนี้กับระบบของผมมานานแล้วครับ .... ซึ่งต่อให้ผู้ใช้กดพร้อมกันจริงๆก็จะได้เลขออกมาไม่ตรงกันแน่นอนครับ.....
|
 |
 |
 |
 |
Date :
2011-11-23 11:40:39 |
By :
Songkram |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
งั้นก็แสดงความเสียใจด้วยครับ สำหรับคำตอบของผม... ที่อาจจะไม่ตรงกับความต้องการของ จขกท. ที่ผมใช้วิธีของผมก็เพราะต้องการลดการทำงานของ server นั้นแหละครับ เพราะการสร้างตารางขึ้นมาอีกตารางเพื่อการเก็บ max number ก็เพื่อให้ครั้งต่อไปในการหาค่า max ก็มา select ที่ตารางนี้ เพราะตารางนี้เก็บข้อมูลไม่กี่ record เท่านั้นครับ แต่ถ้าใช้ select max ที่ตาราง transection หลักเลยแล้วล่ะก็อาจะมีปัญหาในกรณีที่มีปริมาณข้อมูลมากๆ เพราะกว่าจะเจอ max number ที่ transection table ก็คงต้องใช้เวลานานตามจำนวน record ที่เพิ่มขึ้น
อีกอย่างการทำงานของ server มี process เยอะ แต่ process เล็กๆ จะดีกว่า process น้อย แต่ process ใหญ่ๆ ครับ
ยืนยันว่าทุกคำแนะนำเป็นอันเดียวกันครับ... เพราะฉะนั้นจุดประสงค์ของผมก็คือการทำงานที่ใช้ query เล็กๆ แต่ถ้ามันจะมีมากขึ้นอีกสักไม่กี่ query ก็ไม่มีปัญหาครับ.... ที่ถามเรื่อง max function เพราะมีบาง function ที่สามารถใช้ได้เฉพาะ database แต่ละตัวครับ (ผมไม่เคยใช้ dbf)
และอีกอย่าง syntax ที่ถูกต้องของการเขียน sql เพื่อการ insert ก็คือ
INSERT INTO table(field1, field2, field3) VALUES(val1, val2, val3)
ซึ่งในกรณีของคุณก็คือ val1 น่าจะแทนที่ด้วย SELECT MAX(fnum) +1 FROM table_test
|
 |
 |
 |
 |
Date :
2011-11-23 13:50:12 |
By :
Songkram |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|