0Pricing
SQL Academy · บทเรียน

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 ของแถวลูกเป็น NULL
  • SET 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ข้อจำกัด NOT NULL และ CHECK
  2. ข้อจำกัด UNIQUE และคีย์ผสม
  3. FOREIGN KEY และการดำเนินการด้านความสัมพันธ์
  4. ค่า DEFAULT และคอลัมน์ที่สร้างขึ้น
← กลับไปที่ SQL Academy