Transact-SQL - การแทรกข้อมูล แบบสอบถาม SQL INSERT INTO - เติมฐานข้อมูลด้วยข้อมูล SQL แทรกไวยากรณ์
ปรับปรุงล่าสุด: 07/13/2017
ในการเพิ่มข้อมูล จะใช้คำสั่ง INSERT ซึ่งมีรูปแบบดังนี้:
INSERT table_name [(column_list)] ค่า (value1, value2, ... valueN)
ที่จุดเริ่มต้นมีนิพจน์ INSERT INTO จากนั้นในวงเล็บคุณสามารถระบุรายการคอลัมน์ที่คั่นด้วยเครื่องหมายจุลภาคที่คุณต้องการเพิ่มข้อมูลและในตอนท้ายหลังจากคำว่า VALUES ค่าที่เพิ่มสำหรับคอลัมน์คือ ระบุไว้ในวงเล็บ
ตัวอย่างเช่น สมมติว่าฐานข้อมูลต่อไปนี้ถูกสร้างขึ้นก่อนหน้านี้:
สร้างฐานข้อมูล productsdb; ใช้ productsdb; สร้างผลิตภัณฑ์ตาราง (รหัสหลัก INT IDENTITY, ProductName NVARCHAR (30) ไม่ใช่ NULL, ผู้ผลิต NVARCHAR (20) ไม่ใช่ NULL, ProductCount INT DEFAULT 0, ราคา MONEY NOT NULL)
ให้เพิ่มหนึ่งบรรทัดโดยใช้คำสั่ง INSERT:
ใส่ค่าผลิตภัณฑ์ ("iPhone 7", "Apple", 5, 52000)
หลังจากดำเนินการสำเร็จใน SQL Server Management Studio ข้อความ "1 แถวที่ได้รับผลกระทบ" ควรปรากฏในฟิลด์ข้อความ:
โปรดทราบว่าค่าสำหรับคอลัมน์ในวงเล็บหลังจากส่งผ่านคีย์เวิร์ด VALUES ตามลำดับที่มีการประกาศ ตัวอย่างเช่น ในคำสั่ง CREATE TABLE ด้านบน คุณจะเห็นว่าคอลัมน์แรกคือ Id แต่เนื่องจากมีการตั้งค่าแอตทริบิวต์ IDENTITY ไว้ ค่าของคอลัมน์นี้จะถูกสร้างขึ้นโดยอัตโนมัติ และคุณไม่จำเป็นต้องระบุ คอลัมน์ที่สองแสดงถึง ProductName ดังนั้นค่าแรก สตริง "iPhone 7" จะถูกส่งต่อไปยังคอลัมน์นั้น ค่าที่สองคือสตริง "Apple" จะถูกส่งต่อไปยังคอลัมน์ผู้ผลิตที่สาม เป็นต้น นั่นคือค่าจะถูกส่งต่อไปยังคอลัมน์ดังต่อไปนี้:
ชื่อสินค้า: "iPhone 7"
ผู้ผลิต: "แอปเปิ้ล"
นอกจากนี้ เมื่อป้อนค่า คุณสามารถระบุคอลัมน์ที่จะเพิ่มค่าได้ทันที:
INSERT INTO ผลิตภัณฑ์ (ProductName, Price, ผู้ผลิต) VALUES ("iPhone 6S", 41000, "Apple")
ที่นี่ ค่าถูกระบุสำหรับสามคอลัมน์เท่านั้น และตอนนี้ค่าจะถูกส่งต่อในลำดับของคอลัมน์:
ชื่อสินค้า: "iPhone 6S"
ผู้ผลิต: "แอปเปิ้ล"
สำหรับคอลัมน์ที่ไม่ระบุ (ในกรณีนี้ ProductCount) ค่าเริ่มต้นจะถูกเพิ่มหากมีการตั้งค่าแอตทริบิวต์ DEFAULT หรือ NULL อย่างไรก็ตาม คอลัมน์ที่ไม่ระบุต้องเป็นค่าว่างหรือเป็นค่าเริ่มต้น
นอกจากนี้เรายังสามารถเพิ่มหลายบรรทัดพร้อมกัน:
ใส่ค่าผลิตภัณฑ์ ("iPhone 6", "Apple", 3, 36000), ("Galaxy S8", "Samsung", 2, 46000), ("Galaxy S8 Plus", "Samsung", 1, 56000)
ในกรณีนี้ จะมีการเพิ่มสามแถวลงในตาราง
นอกจากนี้ เมื่อเพิ่ม เราสามารถระบุได้ว่าจะใช้ค่าเริ่มต้นสำหรับคอลัมน์โดยใช้คีย์เวิร์ด DEFAULT หรือ NULL:
INSERT INTO ผลิตภัณฑ์ (ProductName, ผู้ผลิต, ProductCount, Price) VALUES ("Mi6", "Xiaomi", DEFAULT, 28000)
ในกรณีนี้ ค่าเริ่มต้นจะถูกใช้สำหรับคอลัมน์ ProductCount (หากตั้งค่าไว้ หากไม่ใช่ จะเป็น NULL)
หากคอลัมน์ทั้งหมดมีแอตทริบิวต์ DEFAULT เริ่มต้น หรือเป็นค่าว่าง คุณสามารถแทรกค่าเริ่มต้นสำหรับคอลัมน์ทั้งหมดได้:
INSERT INTO ค่าเริ่มต้นของผลิตภัณฑ์
แต่ถ้าคุณใช้ตารางผลิตภัณฑ์ คำสั่งดังกล่าวจะล้มเหลว เนื่องจากหลายฟิลด์ไม่มีแอตทริบิวต์ DEFAULT และไม่อนุญาตให้มีค่า NULL ในเวลาเดียวกัน
คำสั่งนี้เพิ่มอย่างน้อยหนึ่งระเบียนลงในตาราง (ดำเนินการแบบสอบถามแบบผนวก)
ไวยากรณ์
ขอเพิ่มหลายระเบียน:
ใส่ลงใน ปลายทาง_object [(field1[, field2[, ...]])]
เลือก [ แหล่งที่มา.]field1[, field2[, ...]
จาก table_expression
ขอเพิ่มหนึ่งระเบียน:
ใส่ลงใน ปลายทาง_object [(field1[, field2[, ...]])]
ค่านิยม ( field1[, field2[, ...])
คำสั่ง INSERT INTO ประกอบด้วยองค์ประกอบต่อไปนี้:
ส่วนหนึ่ง | คำอธิบาย |
---|---|
ปลายทาง_object |
ชื่อของตารางหรือคิวรีที่จะเพิ่มระเบียน |
field1, field2 |
หลังจากการโต้เถียง ปลายทาง_object- ชื่อของฟิลด์ที่เพิ่มข้อมูล; หลังจากการโต้เถียง แหล่งที่มา- ชื่อของฟิลด์ที่ดึงข้อมูล |
ฐานข้อมูลภายนอก |
เส้นทางไปยังฐานข้อมูลภายนอก สำหรับคำอธิบายของพาธ โปรดดูบทความ IN clause |
แหล่งที่มา |
ชื่อของตารางหรือคิวรีที่คัดลอกเรกคอร์ด |
table_expression |
ชื่อตารางอย่างน้อยหนึ่งชื่อที่จะดึงข้อมูลระเบียน อาร์กิวเมนต์นี้สามารถเป็นชื่อของตารางแต่ละรายการ นิพจน์ผลลัพธ์ที่สร้างโดยใช้ INNER JOIN, LEFT JOIN หรือ RIGHT JOIN หรือคิวรีที่เก็บไว้ |
มูลค่า1, ค่า2 |
ค่าที่จะเพิ่มลงในฟิลด์เฉพาะในเรกคอร์ดใหม่ แต่ละค่าจะถูกแทรกลงในฟิลด์ที่สอดคล้องกับตำแหน่งในรายการ: มูลค่า1เพิ่มไปยัง field1รายการใหม่, ค่า2- วี field2เป็นต้น คั่นค่าด้วยเครื่องหมายจุลภาคและใส่ฟิลด์ข้อความในเครื่องหมายคำพูด ("") |
หมายเหตุ
ด้วยคำสั่ง INSERT INTO คุณสามารถเพิ่มระเบียนเดียวลงในตารางโดยใช้ไวยากรณ์ข้างต้น ในกรณีนี้ จะมีการระบุชื่อและค่าสำหรับแต่ละฟิลด์ในเรกคอร์ด คุณต้องระบุฟิลด์ทั้งหมดของเรกคอร์ดที่คุณกำหนดค่าและค่าที่เกี่ยวข้อง หากคุณไม่ระบุค่าฟิลด์ ค่านั้นจะถูกกำหนดเป็นค่าเริ่มต้นหรือ NULL เร็กคอร์ดจะถูกผนวกเข้ากับส่วนท้ายของตาราง
คุณยังสามารถใช้ INSERT INTO เพื่อเพิ่มชุดระเบียนจากตารางหรือคิวรีอื่นโดยใช้คำสั่ง SELECT ... FROM ดังที่แสดงด้านบน (ดูไวยากรณ์สำหรับคิวรีเพื่อเพิ่มหลายระเบียน) ในกรณีนี้ คำสั่ง SELECT จะระบุฟิลด์ที่จะเพิ่มไปยังฟิลด์ที่ระบุ ปลายทาง_object.
แหล่งที่มาหรือ ปลายทาง_objectสามารถเป็นตารางหรือแบบสอบถาม ถ้ามีการระบุคิวรี Microsoft Access Database Engine จะเพิ่มระเบียนลงในตารางทั้งหมดที่ส่งคืน
การใช้คำสั่ง INSERT INTO เป็นทางเลือก หากระบุไว้ จะต้องอยู่ก่อนคำสั่ง SELECT
หากตารางปลายทางมีคีย์หลัก ตรวจสอบให้แน่ใจว่าค่าที่เพิ่มลงในฟิลด์คีย์หลักอย่างน้อยหนึ่งรายการไม่ซ้ำกันและแตกต่างจาก โมฆะ; มิฉะนั้นจะไม่มีการเพิ่มรายการ
หากคุณกำลังเพิ่มระเบียนลงในตารางที่มีเขตข้อมูลตัวนับ และคุณต้องการกำหนดหมายเลขใหม่ อย่ารวมเขตข้อมูลตัวนับในแบบสอบถามของคุณ รวมฟิลด์ตัวนับในคิวรีของคุณหากคุณต้องการเก็บค่าดั้งเดิมจากฟิลด์
คุณสามารถเพิ่มระเบียนลงในตารางในฐานข้อมูลอื่นโดยใช้คำสั่ง IN
ในการสร้างตาราง ให้ใช้คำสั่ง SELECT ... INTO เพื่อรับคิวรีเพื่อสร้างตาราง
ก่อนเรียกใช้การเพิ่มคิวรี ให้ใช้คิวรีแบบใช้เลือกข้อมูลที่มีเกณฑ์การเลือกเดียวกันเพื่อกำหนดว่าเรกคอร์ดใดจะถูกเพิ่มตามผลลัพธ์ที่ได้รับ
ผนวกบันทึกการคัดลอกคิวรีจากตารางอย่างน้อยหนึ่งตารางไปยังอีกตารางหนึ่ง ในเวลาเดียวกัน ตารางที่มีระเบียนที่เพิ่มไว้จะไม่เปลี่ยนแปลง
แทนที่จะเพิ่มระเบียนจากตารางอื่น คุณสามารถระบุค่าของแต่ละเขตข้อมูลในระเบียนใหม่แยกกันโดยใช้ส่วนคำสั่ง VALUES หากละเว้นรายการฟิลด์ ส่วนคำสั่ง VALUES จะต้องรวมค่าที่สอดคล้องกันสำหรับแต่ละฟิลด์ในตาราง มิฉะนั้น การดำเนินการ INSERT จะล้มเหลว ใช้คำสั่ง INSERT INTO พร้อมกับส่วนคำสั่ง VALUES สำหรับแต่ละระเบียนเพิ่มเติมที่คุณต้องการสร้าง
คำสั่ง SQL INSERT INTO และ INSERT SELECT ใช้เพื่อแทรกแถวใหม่ลงในตาราง มีสองวิธีในการใช้คำแนะนำ:
- ค่าเท่านั้น: วิธีแรกใช้สำหรับระบุเฉพาะค่าข้อมูลที่จะแทรกโดยไม่มีชื่อคอลัมน์
ไวยากรณ์:
INSERT INTO table_name ค่า (value1, value2, value3, ...); table_name: ชื่อของตาราง value1,value2, ..: ค่าของคอลัมน์แรก, คอลัมน์ที่สอง, ... สำหรับบันทึกใหม่
- ชื่อคอลัมน์และค่า: วิธีที่สองระบุชื่อคอลัมน์และค่าแถวที่จะแทรก:
ไวยากรณ์:
INSERT INTO table_name (column1, column2, column3, ..) VALUES (value1, value2, value3, ...); table_name: ชื่อของตาราง column1: ชื่อคอลัมน์แรก, คอลัมน์ที่สอง ... value1, value2, ..: ค่าของคอลัมน์แรก, คอลัมน์ที่สอง, ... สำหรับบันทึกใหม่
คำขอ:
วิธีที่ 1 ( ใส่เฉพาะค่า):
แทรกลงในค่านิยมของนักเรียน ("5", "รุนแรง", "เบงกอลตะวันตก", "8759770477", "19");
ผลลัพธ์ :
หลังจากใช้ INSERT INTO SELECT ตารางนักเรียนจะมีลักษณะดังนี้:
ROLL_NO | ชื่อ | ที่อยู่ | โทรศัพท์ | อายุ |
1 | แกะ | เดลี | 9455123451 | 18 |
2 | ราเมช | คุร์เคาน์ | 9562431543 | 18 |
3 | สุจิตต์ | ROHTAK | 9156253131 | 20 |
4 | SURESH | เดลี | 9156768971 | 18 |
3 | สุจิตต์ | ROHTAK | 9156253131 | 20 |
2 | ราเมช | คุร์เคาน์ | 9562431543 | 18 |
5 | รุนแรง | เบงกอลตะวันตก | 8759770477 | 19 |
วิธีที่ 2 ( การแทรกค่าลงในคอลัมน์ที่ระบุเท่านั้น):
INSERT INTO นักเรียน (ROLL_NO, NAME, อายุ) VALUES ("5", "PRATIK", "19");
ผลลัพธ์ :
ตารางนักเรียนจะมีลักษณะดังนี้:
ROLL_NO | ชื่อ | ที่อยู่ | โทรศัพท์ | อายุ |
1 | แกะ | เดลี | 9455123451 | 18 |
2 | ราเมช | คุร์เคาน์ | 9562431543 | 18 |
3 | สุจิตต์ | ROHTAK | 9156253131 | 20 |
4 | SURESH | เดลี | 9156768971 | 18 |
3 | สุจิตต์ | ROHTAK | 9156253131 | 20 |
2 | ราเมช | คุร์เคาน์ | 9562431543 | 18 |
5 | ประติกร | โมฆะ | โมฆะ | 19 |
โปรดทราบว่าคอลัมน์ที่ไม่มีค่าจะถูกตั้งค่าเป็น null
การใช้ SELECT ในคำสั่ง INSERT INTO
คุณสามารถใช้คำสั่ง MySQL INSERT SELECT เพื่อคัดลอกแถวจากตารางหนึ่งและแทรกลงในตารางอื่น
การใช้ตัวดำเนินการนี้เหมือนกับการใช้ INSERT INTO ข้อแตกต่างคือคำสั่ง SELECT ใช้เพื่อดึงข้อมูลจากตารางอื่น ต่อไปนี้เป็นวิธีต่างๆ ในการใช้ INSERT INTO SELECT:
- แทรกทุกคอลัมน์ของตาราง: คุณสามารถคัดลอกข้อมูลตารางทั้งหมดแล้ววางลงในตารางอื่นได้
ไวยากรณ์:
INSERT INTO first_table SELECT * จาก second_table; first_table: ชื่อของตารางแรก Second_table: ชื่อของตารางที่สอง
เราใช้คำสั่ง SELECT เพื่อคัดลอกข้อมูลจากตารางหนึ่งและคำสั่ง INSERT INTO เพื่อแทรกลงในอีกตารางหนึ่ง
- แทรกแต่ละคอลัมน์ของตาราง... คุณสามารถคัดลอกเฉพาะคอลัมน์ตารางที่คุณต้องการวางลงในตารางอื่น
ไวยากรณ์:
INSERT INTO first_table (column_names1) เลือก column_names2 จาก second_table; first_table: ชื่อของตารางแรก Second_table: ชื่อของตารางที่สอง column_names1: ชื่อคอลัมน์ที่คั่นด้วยเครื่องหมายจุลภาค (,) สำหรับตาราง 1.column_names2: ชื่อคอลัมน์ที่คั่นด้วยเครื่องหมายจุลภาค (,) สำหรับตารางที่ 2
เราใช้คำสั่ง SELECT เพื่อคัดลอกข้อมูลจากคอลัมน์ที่เลือกของตารางที่สองเท่านั้น และคำสั่ง MySQL INSERT INTO SELECT เพื่อแทรกลงในตารางแรก
- คัดลอกเฉพาะแถวจากตาราง... คุณสามารถคัดลอกแถวที่ระบุจากตารางเพื่อแทรกลงในตารางอื่นในภายหลังได้โดยใช้ส่วนคำสั่ง WHERE ที่มีคำสั่ง SELECT ในกรณีนี้ คุณต้องใช้เงื่อนไขที่เกี่ยวข้องใน WHERE
ไวยากรณ์:
ตารางที่ 2: ข้างนักเรียน
ROLL_NO | ชื่อ | ที่อยู่ | โทรศัพท์ | อายุ |
7 | ซูวิค | ดัมดุม | 9876543210 | 18 |
8 | นิรัช | นอยดา | 9786543210 | 19 |
9 | โซเมช | ROHTAK | 9687543210 | 20 |
คำขอ:
วิธีที่ 1 ( แทรกแถวและคอลัมน์ทั้งหมด):
INSERT INTO นักเรียน SELECT * จาก LateralStudent;
ผลลัพธ์ :
แบบสอบถามนี้จะแทรกข้อมูลทั้งหมดจากตาราง LateralStudent ลงในตารางนักเรียน หลังจากใช้ SQL INSERT INTO SELECT ตารางนักเรียนจะมีลักษณะดังนี้:
ROLL_NO | ชื่อ | ที่อยู่ | โทรศัพท์ | อายุ |
1 | แกะ | เดลี | 9455123451 | 18 |
2 | ราเมช | คุร์เคาน์ | 9562431543 | 18 |
3 | สุจิตต์ | ROHTAK | 9156253131 | 20 |
4 | SURESH | เดลี | 9156768971 | 18 |
3 | สุจิตต์ | ROHTAK | 9156253131 | 20 |
2 | ราเมช | คุร์เคาน์ | 9562431543 | 18 |
7 | ซูวิค | ดัมดุม | 9876543210 | 18 |
8 | นิรัช | นอยดา | 9786543210 | 19 |
9 | โซเมช | ROHTAK | 9687543210 | 20 |
วิธีที่ 2 ( การแทรกแต่ละคอลัมน์):
INSERT INTO นักเรียน (ROLL_NO, NAME, อายุ) SELECT ROLL_NO, NAME, อายุ FROM LateralStudent;
ผลลัพธ์ :
แบบสอบถามนี้จะแทรกข้อมูลจากคอลัมน์ ROLL_NO, NAME และอายุของตาราง LateralStudent ลงในตารางนักเรียน คอลัมน์ที่เหลือในตาราง Student จะถูกตั้งค่าเป็น null หลังจากใช้ SQL INSERT SELECT ตารางจะมีลักษณะดังนี้:
ROLL_NO | ชื่อ | ที่อยู่ | โทรศัพท์ | อายุ |
1 | แกะ | เดลี | 9455123451 | 18 |
2 | ราเมช | คุร์เคาน์ | 9562431543 | 18 |
3 | สุจิตต์ | ROHTAK | 9156253131 | 20 |
4 | SURESH | เดลี | 9156768971 | 18 |
3 | สุจิตต์ | ROHTAK | 9156253131 | 20 |
2 | ราเมช | คุร์เคาน์ | 9562431543 | 18 |
7 | ซูวิค | โมฆะ | โมฆะ | 18 |
8 | นิรัช | โมฆะ | โมฆะ | 19 |
9 | โซเมช | โมฆะ | โมฆะ | 20 |
- การเลือกแถวเฉพาะสำหรับการแทรก:
ผลลัพธ์ :
แบบสอบถามนี้จะเลือกเฉพาะแถวแรกจากตาราง LateralStudent เพื่อแทรกลงในตารางนักเรียน หลังจากใช้ INSERT SELECT ตารางจะเป็นแบบนี้
คำสั่ง INSERT แทรกระเบียนใหม่ลงในตาราง ในกรณีนี้ ค่าของคอลัมน์อาจเป็นค่าคงที่ตามตัวอักษร หรือเป็นผลจากเคียวรีย่อยก็ได้ ในกรณีแรก คำสั่ง INSERT แยกกันถูกใช้เพื่อแทรกแต่ละแถว ในกรณีที่สอง จะมีการแทรกแถวมากที่สุดเท่าที่จะส่งกลับโดยแบบสอบถามย่อย
ไวยากรณ์สำหรับตัวดำเนินการมีดังนี้:
| (ค่าเริ่มต้น)
ใส่ลงใน [(, ...)]
(ค่า (, ...))
ดังที่คุณเห็นจากไวยากรณ์ที่มีให้ รายการคอลัมน์เป็นทางเลือก (ตามที่ระบุโดยวงเล็บเหลี่ยมในคำอธิบายไวยากรณ์) หากไม่มีรายการค่าที่แทรกจะต้องสมบูรณ์ กล่าวคือ ระบุค่าสำหรับคอลัมน์ทั้งหมดของตาราง อย่างไรก็ตาม ลำดับของค่าต้องตรงกับลำดับที่ระบุโดยคำสั่ง CREATE TABLE สำหรับตารางที่แทรกแถว นอกจากนี้ ค่าเหล่านี้จะต้องเป็นประเภทข้อมูลเดียวกับคอลัมน์ที่ป้อน ตัวอย่างเช่น ลองแทรกแถวลงในตารางผลิตภัณฑ์ที่สร้างโดยคำสั่ง CREATE TABLE ต่อไปนี้:
สร้างผลิตภัณฑ์ตาราง
ถ่านชง (1) ไม่เป็นโมฆะ
รุ่น varchar (4) ไม่ NULL
พิมพ์ varchar (7) ไม่ NULL
สมมติว่าคุณต้องการเพิ่มไปยังตารางรุ่น PC 1157 จากผู้ผลิต B ซึ่งสามารถทำได้ด้วยตัวดำเนินการต่อไปนี้:
INSERT INTO สินค้า
ค่านิยม ("B", 1157, "PC");
หากคุณระบุรายการคอลัมน์ คุณสามารถเปลี่ยนลำดับ "ธรรมชาติ" ดังต่อไปนี้:
INSERT INTO สินค้า (ชนิด รุ่น ผู้ผลิต)
ค่านิยม ("PC", 1157, "B");
ดูเหมือนว่านี่เป็นคุณสมบัติที่ซ้ำซ้อนโดยสิ้นเชิง ซึ่งทำให้การออกแบบยุ่งยากมากขึ้นเท่านั้น อย่างไรก็ตาม จะชนะหากคอลัมน์มีค่าเริ่มต้น พิจารณาโครงสร้างตารางต่อไปนี้:
สร้างตาราง product_D
ผู้ผลิตถ่าน (1) NULL,
รุ่น varchar (4) NULL
พิมพ์ varchar (7) ไม่ใช่ค่าเริ่มต้น "PC"
โปรดทราบว่าที่นี่ค่าของคอลัมน์ทั้งหมดมีค่าเริ่มต้น (สองตัวแรกคือ NULL และคอลัมน์สุดท้ายคือประเภท - PC) ตอนนี้เราสามารถเขียน:
INSERT INTO Product_D (รุ่น ผู้ผลิต)
ค่า (1157, "B");
ในกรณีนี้ ค่าที่หายไปจะถูกแทนที่ด้วยค่าเริ่มต้น PC เมื่อแทรกแถว โปรดทราบว่าหากไม่ได้ระบุค่าเริ่มต้นสำหรับคอลัมน์ในคำสั่ง CREATE TABLE และไม่ได้ระบุข้อจำกัด NOT NULL เพื่อห้ามการใช้ NULL ในคอลัมน์ตารางที่กำหนด ระบบจะถือว่าค่าเริ่มต้นเป็น NULL
คำถามเกิดขึ้น: เป็นไปได้ไหมที่จะไม่ระบุรายการคอลัมน์และใช้ค่าเริ่มต้น? คำตอบคือใช่ เมื่อต้องการทำสิ่งนี้ แทนที่จะระบุค่าอย่างชัดเจน ให้ใช้คำสงวน DEFAULT:
INSERT INTO Product_D
ค่า ("B", 1158, ค่าเริ่มต้น);
เนื่องจากคอลัมน์ทั้งหมดมีค่าเริ่มต้น เราสามารถเขียนเพื่อแทรกแถวด้วยค่าเริ่มต้น:
INSERT INTO Product_D
ค่า (ค่าเริ่มต้น ค่าเริ่มต้น ค่าเริ่มต้น);
อย่างไรก็ตาม สำหรับกรณีนี้มีโครงสร้างค่าเริ่มต้นพิเศษ (ดูไวยากรณ์ตัวดำเนินการ) ซึ่งตัวดำเนินการข้างต้นสามารถเขียนใหม่เป็น
INSERT INTO Product_D ค่าเริ่มต้น;
โปรดทราบว่าเมื่อแทรกแถวลงในตาราง ข้อจำกัดทั้งหมดที่กำหนดไว้ในตารางนี้จะถูกตรวจสอบ สิ่งเหล่านี้อาจเป็นคีย์หลักหรือข้อจำกัดดัชนีเฉพาะ ข้อจำกัดการตรวจสอบ เช่น การตรวจสอบ และข้อจำกัดด้านความสมบูรณ์ของการอ้างอิง หากมีการละเมิดข้อจำกัด การแทรกแถวจะถูกปฏิเสธ ทีนี้มาดูกรณีการใช้งานสำหรับเคียวรีย่อยกัน สมมติว่าเราจำเป็นต้องแทรกลงในตาราง Product_D ทุกแถวจากตารางผลิตภัณฑ์ที่เกี่ยวข้องกับรุ่นของคอมพิวเตอร์ส่วนบุคคล (ประเภท = 'PC') เนื่องจากค่าที่เราต้องการมีอยู่แล้วในบางตาราง การก่อตัวของแถวที่แทรกด้วยตนเอง ประการแรก ไม่ได้ผล และประการที่สอง อาจทำให้เกิดข้อผิดพลาดในการป้อนข้อมูลได้ การใช้แบบสอบถามย่อยแก้ปัญหาเหล่านี้:
ในกรณีนี้ การใช้สัญลักษณ์ "*" ในแบบสอบถามย่อยนั้นสมเหตุสมผล เนื่องจากลำดับของคอลัมน์จะเหมือนกันสำหรับทั้งสองตาราง หากไม่เป็นเช่นนั้น จะต้องใช้รายการคอลัมน์ในคำสั่ง INSERT ในเคียวรีย่อย หรือทั้งสองอย่าง ซึ่งจะตรงกับลำดับของคอลัมน์:
เช่นเดียวกับเมื่อก่อน คุณสามารถระบุคอลัมน์บางคอลัมน์ได้หากคุณต้องการใช้ค่าเริ่มต้นที่มีอยู่ ตัวอย่างเช่น
ในกรณีนี้ ค่า PC เริ่มต้นสำหรับแถวที่แทรกทั้งหมดจะถูกแทนที่ลงในคอลัมน์ประเภทของตาราง Product_D
โปรดทราบว่าเมื่อใช้เคียวรีย่อยที่มีเพรดิเคต เฉพาะแถวที่ค่าเพรดิเคตเป็น TRUE (ไม่ใช่ UNKNOWN!) เท่านั้นที่จะถูกแทรก กล่าวอีกนัยหนึ่ง หากคอลัมน์ประเภทในตารางผลิตภัณฑ์เป็นค่าว่างได้ และค่านั้นมีอยู่ในหลายแถว แถวเหล่านั้นจะไม่ถูกแทรกลงในตาราง Product_D
เพื่อเอาชนะข้อจำกัดของการแทรกแถวเดียวในคำสั่ง INSERT เมื่อใช้ตัวสร้างแถวในอนุประโยค VALUES สามารถใช้เทคนิคเทียมของการใช้แบบสอบถามย่อยที่สร้างแถวที่มีอนุประโยค UNION ALL ได้ ดังนั้นหากเราต้องการแทรกหลายแถวโดยใช้คำสั่ง INSERT เดียว เราสามารถเขียนได้ดังนี้
INSERT INTO Product_D
SELECT "B" AS maker, รุ่น 1158 AS, "PC" AS type
ยูเนี่ยน ALL
เลือก "C", 2190, "แล็ปท็อป"
ยูเนี่ยน ALL
เลือก "D", 3219, "เครื่องพิมพ์";
การใช้ UNION ALL ดีกว่า UNION แม้ว่าจะไม่มีการรับประกันสตริงที่ซ้ำกัน เนื่องจากจะไม่มีการตรวจสอบซ้ำ
ควรสังเกตว่าการแทรก tuples หลายตัวโดยใช้ตัวสร้างสตริงมีการใช้งานแล้วใน ระบบการจัดการฐานข้อมูลเชิงสัมพันธ์ (DBMS) ที่พัฒนาโดย Microsoft CorporationStructured Query Language) เป็นภาษาคอมพิวเตอร์สากลที่ใช้ในการสร้าง แก้ไข และจัดการข้อมูลในฐานข้อมูลเชิงสัมพันธ์ SQL Server 2008 เมื่อคำนึงถึงโอกาสนี้ แบบสอบถามสุดท้ายสามารถเขียนใหม่เป็น:
INSERT INTO Product_D ค่า
("B", 1158, "พีซี")
("C", 2190, "แล็ปท็อป"),
INSERT INTO คืออะไร?
เป้าหมายหลักของระบบฐานข้อมูลคือการจัดเก็บข้อมูลในตาราง ข้อมูลมักจะถูกจัดเตรียมโดยโปรแกรมแอปพลิเคชันที่ทำงานบนฐานข้อมูล ในตอนท้ายนั้น SQL มีคำสั่ง INSERT ที่ใช้ในการเก็บข้อมูลลงในตาราง NS คำสั่ง INSERT สร้างแถวใหม่ในตารางเพื่อเก็บข้อมูลไวยากรณ์พื้นฐาน
ลองดูที่ไวยากรณ์พื้นฐานของคำสั่ง SQL INSERT ที่แสดงด้านล่าง
INSERT INTO `table_name` (column_1, column_2, ...) VALUES (value_1, value_2, ...);
- INSERT INTO `table_name`เป็นคำสั่งที่บอกให้เซิร์ฟเวอร์ MySQL เพิ่มแถวใหม่ลงในตารางชื่อ `table_name`
- (column_1, column_2, ...)ระบุคอลัมน์ที่จะอัปเดตในแถวใหม่
- ค่า (value_1, value_2, ...)ระบุค่าที่จะเพิ่มลงในแถวใหม่
เมื่อระบุค่าข้อมูลที่จะแทรกลงในตารางใหม่ ควรพิจารณาสิ่งต่อไปนี้ในขณะที่จัดการกับข้อมูลประเภทต่างๆ
- ประเภทข้อมูลสตริง- ค่าสตริงทั้งหมดควรอยู่ในเครื่องหมายคำพูดเดี่ยว
- ชนิดข้อมูลตัวเลข- ควรระบุค่าตัวเลขทั้งหมดโดยตรงโดยไม่ต้องใส่เครื่องหมายคำพูดเดี่ยวหรือคู่
- ประเภทข้อมูลวันที่- ใส่ค่าวันที่ในเครื่องหมายคำพูดเดี่ยวในรูปแบบ "YYYY-MM-DD"
ตัวอย่าง:
สมมติว่าเรามีรายชื่อสมาชิกห้องสมุดใหม่ที่ต้องเพิ่มลงในฐานข้อมูลดังต่อไปนี้
ชื่อเต็ม | วันเกิด | เพศ | ที่อยู่ทางกายภาพ | รหัสไปรษณีย์ | เบอร์ติดต่อ | ที่อยู่อีเมล |
---|---|---|---|---|---|---|
ลีโอนาร์ด ฮอฟสตัดเตอร์ | ชาย | Woodcrest | 0845738767 | |||
เชลดอน คูเปอร์ | ชาย | Woodcrest | 0976736763 | |||
Rajesh Koothrappali | ชาย | แฟร์วิว | 0938867763 | |||
เลสลี่ วิงเคิล | 14/02/1984 | ชาย | 0987636553 | |||
Howard wolowitz | 24/08/1981 | ชาย | เซาท์พาร์ก | ตู้ปณ. กล่อง 4563 | 0987786553 |
ให้ "INSERT ข้อมูลทีละตัว เราจะเริ่มด้วย Leonard Hofstadter เราจะถือว่าหมายเลขติดต่อเป็นประเภทข้อมูลที่เป็นตัวเลขและไม่ใส่ตัวเลขในเครื่องหมายคำพูดเดี่ยว
INSERT INTO `สมาชิก' (` full_names`, `gender`,` physical_address`, `contact_number`) ค่านิยม (" Leonard Hofstadter "," Male "," Woodcrest ", 0845738767);
การดำเนินการสคริปต์ด้านบนจะทำให้ 0 ลดลงจากหมายเลขติดต่อของ Leonard เนื่องจากค่าจะถือเป็นค่าตัวเลขและศูนย์ (0) ที่จุดเริ่มต้นจะลดลงเนื่องจากไม่มีนัยสำคัญ
เพื่อหลีกเลี่ยงปัญหาดังกล่าว ค่าจะต้องอยู่ในเครื่องหมายคำพูดเดี่ยวดังแสดงด้านล่าง -
INSERT INTO `สมาชิก' (` full_names`, `gender`,` physical_address`, `contact_number`) ค่านิยม (" Sheldon Cooper "," Male "," Woodcrest "," 0976736763 ");
ในกรณีข้างต้น ศูนย์ (0) จะไม่ดรอป
การเปลี่ยนลำดับของคอลัมน์จะไม่มีผลกับแบบสอบถาม INSERT ตราบใดที่ค่าที่ถูกต้องถูกจับคู่กับคอลัมน์ที่ถูกต้อง
แบบสอบถามที่แสดงด้านล่างแสดงให้เห็นถึงจุดข้างต้น
INSERT INTO `สมาชิก' (` contact_number`, `gender`,` full_names`, `physical_address`) VALUES (" 0938867763 "," Male "," Rajesh Koothrappali "," Woodcrest ");
ข้อความค้นหาข้างต้นข้ามคอลัมน์วันเดือนปีเกิด โดยค่าเริ่มต้น MySQL จะแทรกค่า NULL ในคอลัมน์ที่ข้ามไปในการสืบค้น INSERT
ตอนนี้ขอแทรกบันทึกสำหรับเลสลี่ซึ่งมีวันเดือนปีเกิดที่ให้มา ค่าวันที่ควรอยู่ในเครื่องหมายคำพูดเดี่ยวโดยใช้รูปแบบ "YYYY-MM-DD"
INSERT INTO `สมาชิก' (` full_names`, `date_of_birth`,` gender`, `physical_address`,` contact_number`) VALUES ("Leslie Winkle", "1984-02-14", "Male", "Woodcrest", " 0987636553 ");
ข้อความค้นหาทั้งหมดข้างต้นระบุคอลัมน์และจับคู่กับค่าในคำสั่งแทรก หากเรากำลังระบุค่าสำหรับคอลัมน์ทั้งหมดในตาราง เราสามารถละเว้นคอลัมน์จากคิวรีแทรกได้
แทรกลงในค่า `สมาชิก' (9," Howard Wolowitz "," Male "," 1981-08-24 "," SouthPark "," P.O. Box 4563 "," 0987786553 "," lwolowitzemail.me ");
ให้ตอนนี้ใช้คำสั่ง SELECT เพื่อดูแถวทั้งหมดในตารางสมาชิก SELECT * FROM'สมาชิก';
หมายเลขสมาชิก | full_names | เพศ | วันเกิด | physical_address | รหัสไปรษณีย์ | contct_number | อีเมล |
---|---|---|---|---|---|---|---|
1 | เจเน็ต โจนส์ | หญิง | 21-07-1980 | ผังถนนแรกหมายเลข 4 | กระเป๋าส่วนตัว | 0759 253 542 | ที่อยู่อีเมลนี้จะถูกป้องกันจากสแปมบอท คุณต้องเปิดใช้งาน JavaScript เพื่อดู |
2 | เจเน็ต สมิธ โจนส์ | หญิง | 23-06-1980 | Melrose 123 | โมฆะ | โมฆะ | ที่อยู่อีเมลนี้จะถูกป้องกันจากสแปมบอท คุณต้องเปิดใช้งาน JavaScript เพื่อดู |
3 | โรเบิร์ต ฟิล | ชาย | 12-07-1989 | 3rd Street 34 | โมฆะ | 12345 | ที่อยู่อีเมลนี้จะถูกป้องกันจากสแปมบอท คุณต้องเปิดใช้งาน JavaScript เพื่อดู |
4 | กลอเรีย วิลเลียมส์ | หญิง | 14-02-1984 | 2nd Street 23 | โมฆะ | โมฆะ | โมฆะ |
5 | ลีโอนาร์ด ฮอฟสตัดเตอร์ | ชาย | โมฆะ | Woodcrest | โมฆะ | 845738767 | โมฆะ |
6 | เชลดอน คูเปอร์ | ชาย | โมฆะ | Woodcrest | โมฆะ | 976736763 | โมฆะ |
7 | Rajesh Koothrappali | ชาย | โมฆะ | Woodcrest | โมฆะ | 938867763 | โมฆะ |
8 | เลสลี่ วิงเคิล | ชาย | 14-02-1984 | Woodcrest | โมฆะ | 987636553 | โมฆะ |
9 | Howard wolowitz | ชาย | 24-08-1981 | เซาท์พาร์ก | ตู้ปณ. กล่อง 4563 | 987786553 | ที่อยู่อีเมลนี้จะถูกป้องกันจากสแปมบอท คุณต้องเปิดใช้งาน JavaScript เพื่อดู |
สังเกตว่าหมายเลขติดต่อของ Leonard Hofstadter ได้ลดศูนย์ (0) จากหมายเลขติดต่อ เบอร์ติดต่ออื่นๆ ไม่ได้ทิ้งศูนย์ (0) ไว้ที่จุดเริ่มต้น
การแทรกลงในตารางจากตารางอื่น
คำสั่ง INSERT ยังสามารถใช้เพื่อแทรกข้อมูลลงในตารางจากตารางอื่น ไวยากรณ์พื้นฐานดังที่แสดงด้านล่าง
INSERT INTO table_1 เลือก * จาก table_2;
เรามาดูตัวอย่างที่ใช้งานได้จริง เราจะสร้างตารางจำลองสำหรับหมวดหมู่ภาพยนตร์เพื่อการสาธิต เราจะเรียกหมวดหมู่ตารางใหม่ types_archive สคริปต์ที่แสดงด้านล่างสร้างตาราง
สร้างตาราง `categories_archive` (` category_id` int (11) AUTO_INCREMENT, `category_name` varchar (150) DEFAULT NULL, `หมายเหตุ` varchar (500) DEFAULT NULL, คีย์หลัก (`category_id`))
รันสคริปต์ด้านบนเพื่อสร้างตาราง
ตอนนี้ให้แทรกแถวทั้งหมดจากตารางหมวดหมู่ลงในตารางเก็บหมวดหมู่ สคริปต์ที่แสดงด้านล่างช่วยให้เราบรรลุเป้าหมายนั้น
INSERT INTO `categories_archive` SELECT * FROM` หมวดหมู่ `;
การดำเนินการสคริปต์ข้างต้นจะแทรกแถวทั้งหมดจากตารางหมวดหมู่ลงในตารางเก็บถาวรหมวดหมู่ โปรดทราบว่าโครงสร้างตารางจะต้องเหมือนกันเพื่อให้สคริปต์ทำงาน สคริปต์ที่มีประสิทธิภาพมากขึ้นคือสคริปต์ที่จับคู่ชื่อคอลัมน์ในตารางแทรกกับชื่อในตารางที่มีข้อมูล
แบบสอบถามที่แสดงด้านล่างแสดงให้เห็นถึงการใช้งาน
INSERT INTO `categories_archive` (category_id, category_name, หมายเหตุ) SELECT category_id, category_name ข้อสังเกตจาก 'หมวดหมู่';
ดำเนินการแบบสอบถาม SELECT
เลือก * จาก `categories_archive`
ให้ผลลัพธ์ดังแสดงด้านล่าง
หมวดหมู่_id | ชื่อหมวดหมู่ | หมายเหตุ |
---|---|---|
1 | ตลก | ภาพยนตร์ที่มีอารมณ์ขัน |
2 | โรแมนติก | เรื่องราวของความรัก |
3 | มหากาพย์ | หนังเอเลี่ยนเรื่อง |
4 | สยองขวัญ | โมฆะ |
5 | นิยายวิทยาศาสตร์ | โมฆะ |
6 | ระทึกขวัญ | โมฆะ |
7 | การกระทำ | โมฆะ |
8 | โรแมนติกคอมเมดี้ | โมฆะ |
9 | การ์ตูน | โมฆะ |
10 | การ์ตูน | โมฆะ |
สรุป
- คำสั่ง INSERT ใช้เพื่อเพิ่มข้อมูลใหม่ลงในตาราง
- ค่าวันที่และสตริงควรอยู่ในเครื่องหมายคำพูดเดี่ยว
- ค่าตัวเลขไม่จำเป็นต้องอยู่ในเครื่องหมายคำพูด
- คำสั่ง INSERT ยังสามารถใช้เพื่อแทรกข้อมูลจากตารางหนึ่งไปยังอีกตารางหนึ่ง