Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,027

HOME > PHP > PHP Forum > ต้องการ insert ข้อมูลลง ตารางครับ สามารถเขียน SQL insert แบบมีเงื่อนไขแบบ ว่า....



 

ต้องการ insert ข้อมูลลง ตารางครับ สามารถเขียน SQL insert แบบมีเงื่อนไขแบบ ว่า....

 



Topic : 069440



โพสกระทู้ ( 419 )
บทความ ( 0 )



สถานะออฟไลน์




คือ ผมต้องการ insert ข้อมูลลงตาราง database ผมเป็น DBF เชื่อมต่อผ่าน ODBC

ปัญหาคือผม insert ข้อมูลลงตารางโดยมีฟิวล์ๆเก็บตัวเลขแล้วให้รันบวก 1 ไปเรื่อยๆๆรูปแบบประมาณนี้ครับ
Code (PHP)
insert into table_test (fnum,f1,f2,f3)select Max(fnum)+1,'$f1','$f2','$f3' from table_test


มันก็จะเพิ่มข้อมูล ในตัว แปล $f1 , $f2 , $f3 และในฟิวล์ fnum ก็ดึงค่ามากที่สุด แล้ว บวก 1 ลงไปเหมือนกัน autonumber ไปเรื่อยๆๆแหละครับ

ปัญหาของผมคือ
จากฟิวล์ fnum ที่ผมบอก ว่าผมหาค่า max แล้วบวก 1 เรื่อยๆ แต่กรณีที่ใน ตารางไม่มีข้อมูลอยู่เลย มันไม่บวกอ่ะครับ มันเก็บค่า 0 ลงไป
ฟิวล์ต่อไปมันถึงเอา 0 มาบวก 1 เป็นหนึ่งอ่ะครับ คือ ผมไม่อยากให้ record แรกเป็น 0 พอมีวิธีไหมครับ



Tag : PHP, HTML/CSS







Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2011-11-23 10:42:56 By : aimoomoo View : 4265 Reply : 5
 

 

No. 1



โพสกระทู้ ( 314 )
บทความ ( 0 )



สถานะออฟไลน์


แนะนำว่าให้ทำการปรับปรุงค่าก่อนที่จะ insert ลงไปครับ ... กรณีของคุณพยายามที่จะใช้ function ที่ติดมากับ DB เลย ซึ่งก็อาจจะดีในบางกรณี ....

แต่ถ้าเป็นการเพิ่มข้อมูลลงตารางแบบนี้ โดยต้องการค่า max ออกมาก่อน แล้วบวก 1 เข้าไป และยิ่งเป็นข้อมูลที่สำคัญในการเพิ่มค่า คือต้องเพิ่มไม่ผิดเลย เพราะฉะนั้นจึงควรที่จะต้องทำการเขียน code เพื่อให้ได้ค่าที่ถูกต้อง (พร้อมตรวจสอบค่าก่อนในกรณีที่สำคัญมาก) แล้วจึงค่อยทำการ insert

ในกรณีนี้จึงอาจจะต้องทำ 2 ขั้นตอนครับ คือ

1. หาค่า max ออกมาก่อน จะเป็นด้วยแบบไหนก็แล้วแต่... (อาจจะ select max ออกมาแล้วเก็บเข้าตัวแปร แล้วจึงบวก 1 เข้าไป)
2.เอาค่าที่ได้จากข้อแรกมาใช้ในการ insert






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2011-11-23 10:53:53 By : Songkram
 


 

No. 2



โพสกระทู้ ( 419 )
บทความ ( 0 )



สถานะออฟไลน์


ตอบความเห็นที่ 1 นะครับ
Quote:
กรณีของคุณพยายามที่จะใช้ function ที่ติดมากับ DB เลย ซึ่งก็อาจจะดีในบางกรณี

ผมไม่ได้ใช้ function ที่ติดมากับ DB เลยครับ

Quote:
ในกรณีนี้จึงอาจจะต้องทำ 2 ขั้นตอนครับ คือ

1. หาค่า max ออกมาก่อน จะเป็นด้วยแบบไหนก็แล้วแต่... (อาจจะ select max ออกมาแล้วเก็บเข้าตัวแปร แล้วจึงบวก 1 เข้าไป)
2.เอาค่าที่ได้จากข้อแรกมาใช้ในการ insert


ถ้าทำแบบนี้ยิ่งไม่ปลอดภัยแน่ครับ จากประสบการณืที่ลองมาแล้วครับ
ตย.เช่นในขณะเดียวกันมี user เข้ามาใช้พร้อมกันจำนวนมากๆๆ มีผลแน่นอนครับ ง่ายๆๆคือ

มีคน 2 คนเข้ามาใช้ function นี้พร้อมกัน ซึ่งถ้าแบบคุณจ่ะเพิ่มโอกาศการ select ค่า max ที่เป็นค่าเดียวกันออกไปได้ สูงขึ้นน่ะครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2011-11-23 11:14:36 By : aimoomoo
 

 

No. 3



โพสกระทู้ ( 314 )
บทความ ( 0 )



สถานะออฟไลน์


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
 


 

No. 4



โพสกระทู้ ( 419 )
บทความ ( 0 )



สถานะออฟไลน์


Quote:
insert into table_test (fnum,f1,f2,f3)select Max(fnum)+1,'$f1','$f2','$f3' from table_test

function max ในบันทัดข้างบนนี้คือ function ที่ติดมากับ DB (DBF) ใช่หรือไม่.....


ไม่ใช่ครับ เป็นแค่ Sql พื้นฐานครับ

และอยากที่บอกจากความเห็นที่ 3

Quote:
เช่น ผู้ใช้กดปุ่มเพื่อจะ insert ข้อมูล (หรือวิธีไหนก็แล้วแต่) กระบวนงานก็จะไปทำ 2 ขั้นตอนที่ผมว่าเลย (2 ขั้นตอนที่ผมว่าเป็นขั้นตอนย่อยที่ทำงานเบื้องหลังผู้ใช้งาน) เพราะฉะนั้นมันจะทำงานอย่างรวดเร็วจนมีความเป็นไปได้น้อยมากที่จะทำงานพร้อมกันครับ...


มันก็คล้ายจากความเห็นที่ 1 ไม่ใช้หรอครับ



จากวิธีความเห็นที่ 3 ผมเคยทำแล้วครับ ก็ยังเกิดปัญหาอยู่ดีครับ ระบบผม มี user พร้อมกัน ประมาณ 1000 คน ในเวลาที่ จำกัดครับ
โอกาศต้องมี ครับ แล้วผมก็ใช้วิธี ลดความซับซ้อนของการเขียน code ลง ให้ทำงานเสร็จเลยใน SQL ก็แก้ปัญหา นี้ได้ไปแล้วครับ ปัญหาของผมอยู่ที่ ไม่อยากให้ record แรกเป็น 0 ครับ ซึ่งผมก็พอมี วิธีอยู่บ้าง แต่มันเขียน code ค่อนข้างมากนิดนึง เลยอยากได้แนวคิดแบบอื่นที่ ทำงานได้ไม่ผิดพลาดแแหล่ะ ทำงานได้รวดเร็ว ได้ไม่ต้องทำให้ server ทำงานนักและแบกรับ session จำนวน มากๆๆ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2011-11-23 11:56:36 By : aimoomoo
 


 

No. 5



โพสกระทู้ ( 314 )
บทความ ( 0 )



สถานะออฟไลน์


งั้นก็แสดงความเสียใจด้วยครับ สำหรับคำตอบของผม... ที่อาจจะไม่ตรงกับความต้องการของ จขกท. ที่ผมใช้วิธีของผมก็เพราะต้องการลดการทำงานของ 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
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : ต้องการ insert ข้อมูลลง ตารางครับ สามารถเขียน SQL insert แบบมีเงื่อนไขแบบ ว่า....
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 05
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่