กระทู้เก่าบอร์ด อ.Yeadram
1,612 5
URL.หัวข้อ /
URL
ช่วยทีครับเรื่อง insert ข้อมูล
ช่วยทีครับเรื่อง Insert ข้อมูลเนื่องจากว่าผมไม่สามารถทำไพมารี่คีย์ ฟิว ID
ของตาราง A ได้โดยเหตุผลบางประการ ทำให้ผม Append (ผนวกข้อมูล) ทำให้มีข้อมูลที่ซ้ำกัน เกิดขึ้นได้ผมจึงเรียนถามดังนี้
1.จะทำอย่างไีรเวลาเมื่อตาราง A มีข้อมูลอยู่แล้วถ้าเราAppend (ผนวกข้อมูล)
หรือ Insert ข้อมูลเพิ่มเข้าไป ไม่ต้องให้ข้อมูลมีอยู่แล้วเพิ่มอีกเอา
เฉพาะข้อมูลที่ยังไม่มีเพิ่มเข้าไปอันที่ซ้ำไปแล้วก็แล้วไป
แต่จะเพิ่มซ้ำไม่ได้ครับ
ตัวอย่างตาราง A
id name surname qty ad1 ad2 total
1 a sa 1 1 2 3
2 b sb 1 2 2 4
3 c sc 2 5 1 6
ข้อมูลที่ Insert
id name surname qty ad1 ad2 total
4 c sa 1 1 2 3
5 d sb 1 2 2 4
3 c sc 2 5 1 6
ผลลัพธ์ที่ต้องการ
ตาราง A
id name surname qty ad1 ad2 total
1 a sa 1 1 2 3
2 b sb 1 2 2 4
3 c sc 2 5 1 6
4 c sa 1 1 2 3
5 d sb 1 2 2 4
ช่วยทีครับเดือดร้อนจริงๆ ขอบคุณทุกคำตอบนะครับ
ปล ย้ำอีกที id ทำไพมารี่คีย์ไม่ได้
ของตาราง A ได้โดยเหตุผลบางประการ ทำให้ผม Append (ผนวกข้อมูล) ทำให้มีข้อมูลที่ซ้ำกัน เกิดขึ้นได้ผมจึงเรียนถามดังนี้
1.จะทำอย่างไีรเวลาเมื่อตาราง A มีข้อมูลอยู่แล้วถ้าเราAppend (ผนวกข้อมูล)
หรือ Insert ข้อมูลเพิ่มเข้าไป ไม่ต้องให้ข้อมูลมีอยู่แล้วเพิ่มอีกเอา
เฉพาะข้อมูลที่ยังไม่มีเพิ่มเข้าไปอันที่ซ้ำไปแล้วก็แล้วไป
แต่จะเพิ่มซ้ำไม่ได้ครับ
ตัวอย่างตาราง A
id name surname qty ad1 ad2 total
1 a sa 1 1 2 3
2 b sb 1 2 2 4
3 c sc 2 5 1 6
ข้อมูลที่ Insert
id name surname qty ad1 ad2 total
4 c sa 1 1 2 3
5 d sb 1 2 2 4
3 c sc 2 5 1 6
ผลลัพธ์ที่ต้องการ
ตาราง A
id name surname qty ad1 ad2 total
1 a sa 1 1 2 3
2 b sb 1 2 2 4
3 c sc 2 5 1 6
4 c sa 1 1 2 3
5 d sb 1 2 2 4
ช่วยทีครับเดือดร้อนจริงๆ ขอบคุณทุกคำตอบนะครับ
ปล ย้ำอีกที id ทำไพมารี่คีย์ไม่ได้
5 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R11359
ขอบคุณคุณ PichaiTC ที่ช่วยตอบครับปัญหาคือจะกำหนดฟิว id ตาราง A เป็น Key ไม่ได้ครับข้อมูลก่อนหน้านั้นมีการซ้ำกันไปแล้วโปรแกรมไม่ยอมครับที่ข้างบนคือยกตัวอย่างเฉยๆครับข้อมูลจริงมี ID ซ้ำกันเพียบเลย เลยจะให้ข้อมูลที่จะเพิ่มหลังจากนี้ไม่ต้องซ้ำแล้ว ขอทุกท่านช่วยหาแนวทางให้หน่อยครับ
3 @R11363
ถ้าไม่ลำบากมากนักก็ควรกำหนด id เป็นคีย์หลัก
ก่อนหน้านี้ id ซ้ำกัน โปรแกรมก็ยังสามารถทำงานได้
แล้วถ้าหลังจากนี้ไม่อยากให้ id ซ้ำกัน แล้วจะมีความหมายอะไร
ทำอย่างนี้ดีไหมครับ
ทำการ re-id ใหม่
สร้างตารางขึ้นมาใหม่ แล้วนำข้อมูลจากตาราง A ไปเก็บในตารางสำรองก่อน
ขณะเราย้ายข้อมูลไป ก็ทำการ re-id ไปด้วยเลย
PRIVATE SUB Command1_Click()
DIM rst1 as Recordset
DIM rst2 as Recordset
set rst1 = CurrentDB.OpenRecordset("ตารางA",dbOpendynaset)
set rst2 = CurrentDB.OpenRecordset("ตารางB",dbOpendynaset)
rst1.Movefirst
WITH rst2
WHILE not(rst1.EOF)
.Addnew
.field("name") = rst1.field("name")
...
...
.Update
WEND
END WITH
rst1.Close
rst2.Close
END SUB
จากนั้นค่อยลบตาราง A ออก
แล้วเปลี่ยนชื่อตาราง B เป็น ตาราง A
*** หมายเหตุ
หากตาราง A มีความสัมพันธ์กับตารางอื่น ๆ และ/หรือ ใช้ตาราง A ในคิวรี่ MS Access อาจขอให้คุณลบ
ความสัมพันธ์ดังกล่าวออกไปก่อน จากนั้นเราค่อยเชื่อมความสัมพันธ์ใหม่
ถ้าคุณมีการใช้ตาราง A ในหลาย ๆ ที่กลัวปัญหาเรื่องการเชื่อมความสัมพันธ์จะเสียไป อาจต้องใช้วิธีการต่อไปนี้
PRIVATE SUB command1_click()
dim i as integer
dim rst1 as recordset
dim rst2 as recordset
set rst1 = currentdb.openrecordset("ตารางA",dbopendynaset)
set rst2 = rst1.RecordsetClone
rst1.MoveFirst
rst2.MoveFirst
'Delete all content in ตาราง A
WITH rst1
WHILE NOT(rst1.EOF)
.Edit
.Delete
.Update
rst1.MoveNext
WEND
END WITH
i = 1
WITH rst1
WHILE NOT(rst2.EOF)
.AddNew
.Field("id") = i
.Field("name") = rst1.Field("name")
...
...
.Update
i = i +1
WEND
END WITH
rst1.close
rst2.close
END SUB
*** ถ้าตาราง A มีความสัมพันธ์กับตารางอื่น และมีการกำหนด Cadcading Delete/Cadcading Update ข้อมูลในตารางย่อยอาจสูญหายหรือเปลี่ยนแปลงไปด้วย
*** โปรดสำรอง ข้อมูล/ไฟล์ ก่อน เพื่อความมั่นใจว่าข้อมูลของคุณจะไม่สูญหาย
ก่อนหน้านี้ id ซ้ำกัน โปรแกรมก็ยังสามารถทำงานได้
แล้วถ้าหลังจากนี้ไม่อยากให้ id ซ้ำกัน แล้วจะมีความหมายอะไร
ทำอย่างนี้ดีไหมครับ
ทำการ re-id ใหม่
สร้างตารางขึ้นมาใหม่ แล้วนำข้อมูลจากตาราง A ไปเก็บในตารางสำรองก่อน
ขณะเราย้ายข้อมูลไป ก็ทำการ re-id ไปด้วยเลย
PRIVATE SUB Command1_Click()
DIM rst1 as Recordset
DIM rst2 as Recordset
set rst1 = CurrentDB.OpenRecordset("ตารางA",dbOpendynaset)
set rst2 = CurrentDB.OpenRecordset("ตารางB",dbOpendynaset)
rst1.Movefirst
WITH rst2
WHILE not(rst1.EOF)
.Addnew
.field("name") = rst1.field("name")
...
...
.Update
WEND
END WITH
rst1.Close
rst2.Close
END SUB
จากนั้นค่อยลบตาราง A ออก
แล้วเปลี่ยนชื่อตาราง B เป็น ตาราง A
*** หมายเหตุ
หากตาราง A มีความสัมพันธ์กับตารางอื่น ๆ และ/หรือ ใช้ตาราง A ในคิวรี่ MS Access อาจขอให้คุณลบ
ความสัมพันธ์ดังกล่าวออกไปก่อน จากนั้นเราค่อยเชื่อมความสัมพันธ์ใหม่
ถ้าคุณมีการใช้ตาราง A ในหลาย ๆ ที่กลัวปัญหาเรื่องการเชื่อมความสัมพันธ์จะเสียไป อาจต้องใช้วิธีการต่อไปนี้
PRIVATE SUB command1_click()
dim i as integer
dim rst1 as recordset
dim rst2 as recordset
set rst1 = currentdb.openrecordset("ตารางA",dbopendynaset)
set rst2 = rst1.RecordsetClone
rst1.MoveFirst
rst2.MoveFirst
'Delete all content in ตาราง A
WITH rst1
WHILE NOT(rst1.EOF)
.Edit
.Delete
.Update
rst1.MoveNext
WEND
END WITH
i = 1
WITH rst1
WHILE NOT(rst2.EOF)
.AddNew
.Field("id") = i
.Field("name") = rst1.Field("name")
...
...
.Update
i = i +1
WEND
END WITH
rst1.close
rst2.close
END SUB
*** ถ้าตาราง A มีความสัมพันธ์กับตารางอื่น และมีการกำหนด Cadcading Delete/Cadcading Update ข้อมูลในตารางย่อยอาจสูญหายหรือเปลี่ยนแปลงไปด้วย
*** โปรดสำรอง ข้อมูล/ไฟล์ ก่อน เพื่อความมั่นใจว่าข้อมูลของคุณจะไม่สูญหาย
4 @R11364
insert into A(id,name,surname,qty,ad1,ad2,total )
select id,name,surname,qty,ad1,ad2,total from B where not exists (select * from A where A.id = B.id)
select id,name,surname,qty,ad1,ad2,total from B where not exists (select * from A where A.id = B.id)
5 @R11369
ขอบคุณคุณ U&ME และคุณ สันติสุข ที่ช่วยตอบเพิ่มครับ
ตอนนี้กำลังลองอยู่ครับได้ผลยังไงเดี๋ยวมาแจ้งครับ
ตอนนี้กำลังลองอยู่ครับได้ผลยังไงเดี๋ยวมาแจ้งครับ
Time: 0.2319s
ก็กำหนดให้ field กลุ่ม นั้นเป็น Key เลยครับ
ลองใส่ข้อมูลใน table แล้วใช้ tool "Analyze Table" ของ Access ดูก็ได้ครับ