FOREIGN KEY และการดำเนินการด้านความสัมพันธ์
เชื่อมตารางเข้าด้วยกันด้วย FOREIGN KEY และเลือก ON DELETE CASCADE / SET NULL / RESTRICT ให้เหมาะกับพฤติกรรมที่ต้องการ
FOREIGN KEY และการดำเนินการด้านความสัมพันธ์ เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คีย์ต่างประเทศทำอะไร
FOREIGN KEY ทำให้ฐานข้อมูลปฏิเสธแถวที่อ้างอิงไปยังข้อมูลแม่ที่ไม่มีอยู่:
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id),
total NUMERIC(10,2) NOT NULL
);
-- Inserting an order with user_id=999 fails if no such user exists.เหตุใดจึงใช้คีย์ต่างประเทศ
FK บังคับใช้ความถูกต้องของการอ้างอิง:
- ไม่มีแถวกำพร้า
- ตรวจพบข้อผิดพลาดของแอปขณะเพิ่มข้อมูล
- ทำให้แผนภาพ ER ถูกต้อง
- รองรับการส่งต่อผลโดยอัตโนมัติ
การดำเนินการอ้างอิง
ควรเกิดอะไรขึ้นเมื่อแถวแม่ถูกลบหรืออัปเดต มีห้าตัวเลือก:
NO ACTION— เกิดข้อผิดพลาด (ค่าเริ่มต้น และเลื่อนการตรวจสอบได้)RESTRICT— เกิดข้อผิดพลาด (เลื่อนการตรวจสอบไม่ได้)CASCADE— ลบหรืออัปเดตแถวลูกด้วยSET NULL— กำหนด FK ของแถวลูกเป็น NULLSET DEFAULT— กำหนด FK ของแถวลูกเป็นค่าเริ่มต้น
ON DELETE CASCADE
“เมื่อผู้ใช้ถูกลบ ให้ลบคำสั่งซื้อของผู้ใช้นั้นด้วย”:
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL
REFERENCES users(id) ON DELETE CASCADE,
total NUMERIC(10,2) NOT NULL
);ON DELETE SET NULL
“เมื่อผู้จัดการถูกนำออก พนักงานยังคงอยู่แต่ไม่มีผู้จัดการ”:
CREATE TABLE employees (
id BIGSERIAL PRIMARY KEY,
full_name TEXT NOT NULL,
manager_id BIGINT REFERENCES employees(id) ON DELETE SET NULL
);ค่าเริ่มต้น: คล้าย RESTRICT
หากไม่มีการดำเนินการอ้างอิง การพยายามลบแถวแม่ที่มีแถวลูกจะล้มเหลว:
ERROR: update or delete on table "users" violates foreign key constraint "orders_user_id_fkey" on table "orders"
DETAIL: Key (id)=(42) is still referenced from table "orders".สร้างดัชนีให้คอลัมน์ FK เสมอ
PostgreSQL จะไม่สร้างดัชนีที่ฝั่งลูกโดยอัตโนมัติ ให้เพิ่มดัชนีเอง หากไม่มี การลบแถวแม่จะทำให้ต้องสแกนทั้งตารางลูกทุกตาราง:
CREATE INDEX orders_user_id_idx ON orders(user_id);คีย์ต่างประเทศแบบประกอบ
อ้างอิงคีย์หลักแบบประกอบ:
CREATE TABLE order_items (
order_id BIGINT,
line_no INT,
PRIMARY KEY (order_id, line_no)
);
CREATE TABLE shipments (
order_id BIGINT,
line_no INT,
FOREIGN KEY (order_id, line_no)
REFERENCES order_items(order_id, line_no)
);การเลื่อนการตรวจสอบคีย์ต่างประเทศ
บางครั้งคุณจำเป็นต้องเพิ่มข้อมูลคู่ที่ต่างฝ่ายต่างอ้างอิงกัน ให้กำหนด FK เป็น DEFERRABLE INITIALLY DEFERRED:
ALTER TABLE orders
ALTER CONSTRAINT orders_user_id_fkey DEFERRABLE INITIALLY DEFERRED;
BEGIN;
INSERT INTO orders ... ; -- FK temporarily not checked
INSERT INTO users ... ;
COMMIT; -- checked hereการเพิ่มคีย์ต่างประเทศโดยไม่ปิดระบบ
ในตารางขนาดใหญ่ ให้ใช้ NOT VALID + VALIDATE เพื่อหลีกเลี่ยงการล็อกเป็นเวลานาน:
ALTER TABLE orders
ADD CONSTRAINT orders_user_id_fkey
FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID;
ALTER TABLE orders VALIDATE CONSTRAINT orders_user_id_fkey;ใช้การส่งต่ออย่างระมัดระวัง
การลบด้วย CASCADE จะส่งต่อไปยังข้อมูลที่เกี่ยวข้อง การลบผู้ใช้อาจล้างคำสั่งซื้อ การชำระเงิน และบันทึกการตรวจสอบ ตรวจสอบให้แน่ใจว่าการส่งต่อนั้นตรงกับเจตนาทางธุรกิจของคุณ
สรุป
คีย์ต่างประเทศคือราวกั้นป้องกัน
- REFERENCES + การดำเนินการจะประกาศความเชื่อมโยงและพฤติกรรม
- สร้างดัชนีให้คอลัมน์ FK ที่ฝั่งลูก
- ใช้ NOT VALID + VALIDATE สำหรับการเพิ่มโดยไม่ปิดระบบ
ตรวจสอบความเข้าใจอย่างรวดเร็ว
การดำเนินการอ้างอิงใดที่ถูกต้องสำหรับการลบคำสั่งซื้อโดยอัตโนมัติเมื่อผู้ใช้แม่ถูกลบ
คำถามที่พบบ่อย
บทเรียน “FOREIGN KEY และการดำเนินการด้านความสัมพันธ์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “FOREIGN KEY และการดำเนินการด้านความสัมพันธ์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “FOREIGN KEY และการดำเนินการด้านความสัมพันธ์”
เชื่อมตารางเข้าด้วยกันด้วย FOREIGN KEY และเลือก ON DELETE CASCADE / SET NULL / RESTRICT ให้เหมาะกับพฤติกรรมที่ต้องการ คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “FOREIGN KEY และการดำเนินการด้านความสัมพันธ์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ข้อจำกัด NOT NULL และ CHECK
- ข้อจำกัด UNIQUE และคีย์ผสม
- FOREIGN KEY และการดำเนินการด้านความสัมพันธ์
- ค่า DEFAULT และคอลัมน์ที่สร้างขึ้น