SQL Academy · บทเรียน

คีย์หลักและความไม่ซ้ำกัน

ทำความเข้าใจคีย์หลัก คีย์ตัวแทนเทียบกับคีย์ธรรมชาติ คีย์ผสม และเหตุใดทุกแถวต้องมีตัวระบุที่ไม่ซ้ำและเชื่อถือได้

บทเรียน 2 จาก 413 ขั้นตอน

คีย์หลักและความไม่ซ้ำกัน เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดทุกแถวจึงต้องมี ID ที่ไม่ซ้ำกัน

หากต้องการอัปเดตหรือลบแถวใดแถวหนึ่งอย่างปลอดภัย คุณต้องสามารถระบุแถวนั้นได้อย่างไม่กำกวม

  • สามารถมีผู้ใช้สองคนชื่อ "Alice Adams" ได้
  • แต่ต้องไม่มีผู้ใช้สองคนที่มี id = 42
  • ตัวระบุที่ไม่ซ้ำกันนี้เรียกว่าคีย์หลัก

การประกาศคีย์หลัก

คุณกำหนดคอลัมน์ให้เป็นคีย์หลักเมื่อสร้างตาราง:

CREATE TABLE products (
  id    BIGSERIAL PRIMARY KEY,
  sku   VARCHAR(50) NOT NULL,
  name  VARCHAR(200) NOT NULL,
  price NUMERIC(10,2) NOT NULL
);

คีย์หลัก = NOT NULL + UNIQUE

PRIMARY KEY จะบังคับใช้สิ่งต่อไปนี้โดยอัตโนมัติ

  • NOT NULL — ค่าคีย์หลักต้องไม่ขาดหาย
  • UNIQUE — ห้ามมีสองแถวที่ใช้ค่าคีย์หลักเดียวกัน

ฐานข้อมูลยังสร้างดัชนีที่ไม่ซ้ำกันบนคีย์หลัก ทำให้การค้นหาด้วย id ทำได้รวดเร็ว

คีย์แทนค่าเทียบกับคีย์ธรรมชาติ

คุณมีทางเลือกสองแบบสำหรับคีย์หลัก

  • คีย์แทนค่า — ID ที่ฐานข้อมูลสร้างขึ้นเอง (BIGSERIAL, UUID) พบได้บ่อยที่สุดในแอปสมัยใหม่
  • คีย์ธรรมชาติ — ตัวระบุจากโลกจริง (อีเมล, ISBN) มีความเสี่ยง เพราะผู้คนเปลี่ยนอีเมลได้

แนวทางปฏิบัติที่ดีคือใช้ ID แบบคีย์แทนค่า และใส่ข้อจำกัด UNIQUE ให้กับคีย์ธรรมชาติ

BIGSERIAL: จำนวนเต็มที่เพิ่มค่าอัตโนมัติ

ใน PostgreSQL BIGSERIAL จะสร้างคอลัมน์ขนาด 64 บิตที่เพิ่มค่าอัตโนมัติ โดยมีลำดับเป็นกลไกเบื้องหลัง

CREATE TABLE orders (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT NOT NULL,
  total NUMERIC(10,2) NOT NULL
);

-- You omit id on insert and the DB fills it in:
INSERT INTO orders (user_id, total) VALUES (7, 99.50);

คีย์หลักแบบ UUID

อีกทางเลือกหนึ่งคือ UUID ขนาด 128 บิต ซึ่งมีประโยชน์เมื่อ ID ต้องไม่ซ้ำกันข้ามระบบหรือเมื่อสร้างจากฝั่งไคลเอ็นต์

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

CREATE TABLE sessions (
  id    UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  user_id BIGINT NOT NULL,
  ip    INET
);

คีย์หลักแบบประกอบ

บางครั้งตัวระบุธรรมชาติประกอบด้วยคอลัมน์หลายคอลัมน์รวมกัน

CREATE TABLE order_items (
  order_id  BIGINT NOT NULL,
  product_id BIGINT NOT NULL,
  quantity  INT NOT NULL,
  PRIMARY KEY (order_id, product_id)
);

-- The pair (order_id, product_id) must be unique
-- A product can appear at most once per order

ข้อจำกัด UNIQUE เทียบกับคีย์หลัก

คุณสามารถประกาศให้คอลัมน์อื่นมีค่าไม่ซ้ำกันได้ โดยไม่ต้องกำหนดให้คอลัมน์นั้นเป็นคีย์หลัก:

CREATE TABLE users (
  id    BIGSERIAL PRIMARY KEY,
  email VARCHAR(255) NOT NULL UNIQUE,
  username VARCHAR(50) UNIQUE
);

-- INSERT below fails on the second row:
INSERT INTO users (email, username) VALUES ('a@x.com', 'alice');
INSERT INTO users (email, username) VALUES ('a@x.com', 'bob');  -- ERROR

จะเกิดอะไรขึ้นเมื่อแทรกข้อมูลซ้ำ

หากคุณพยายามแทรกคีย์หลักที่ซ้ำกัน ฐานข้อมูลจะปฏิเสธคำสั่งทั้งหมด:

ERROR:  duplicate key value violates unique constraint "users_pkey"
DETAIL:  Key (id)=(42) already exists.

นี่เป็นสิ่งที่ดี เพราะช่วยป้องกันข้อมูลเสียหายโดยไม่รู้ตัว

การค้นหาแถวด้วยคีย์หลักทำได้รวดเร็ว

ดัชนีที่ไม่ซ้ำกันบนคีย์หลักช่วยให้ค้นหาได้ในเวลา O(log n) แม้มีข้อมูลระดับพันล้านแถว

-- Index Scan using users_pkey on users (cost=0.43..8.45 rows=1)
SELECT email FROM users WHERE id = 42;

อย่านำ ID กลับมาใช้ซ้ำ

แม้ว่าคุณจะลบแถวไปแล้ว ก็อย่านำคีย์หลักของแถวนั้นกลับมาใช้ซ้ำ ตารางอื่นหรือระบบภายนอกอาจยังอ้างอิงคีย์นั้นอยู่ ปล่อยให้ลำดับเพิ่มต่อไป เพราะ ID มีต้นทุนต่ำ

ทบทวน

คีย์หลักช่วยให้ทุกแถวมีตัวระบุที่คงที่และไม่ซ้ำกัน

  • เลือกใช้คีย์แทนค่า (BIGSERIAL หรือ UUID) เป็นหลัก
  • ใช้ UNIQUE กับคีย์ธรรมชาติที่ต้องไม่ซ้ำกัน
  • คีย์หลักแบบประกอบใช้จำลองกรณีที่ "คู่ค่านี้ต้องไม่ซ้ำกัน"

ตรวจสอบความเข้าใจอย่างรวดเร็ว

สิ่งใดถูกบังคับใช้โดยปริยายด้วย PRIMARY KEY

เริ่มต้นได้ฟรี

เรียนรู้ SQL ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
46
บทเรียน
183

คำถามที่พบบ่อย

บทเรียน “คีย์หลักและความไม่ซ้ำกัน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “คีย์หลักและความไม่ซ้ำกัน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “คีย์หลักและความไม่ซ้ำกัน”

ทำความเข้าใจคีย์หลัก คีย์ตัวแทนเทียบกับคีย์ธรรมชาติ คีย์ผสม และเหตุใดทุกแถวต้องมีตัวระบุที่ไม่ซ้ำและเชื่อถือได้ คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “คีย์หลักและความไม่ซ้ำกัน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม

ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. RDBMS คืออะไร และเหตุใดตารางจึงสำคัญ
  2. คีย์หลักและความไม่ซ้ำกัน
  3. NULL: ค่าความจริงลำดับที่สาม
  4. ภาพรวมชนิดข้อมูล: INT VARCHAR DATE BOOLEAN
← กลับไปที่ SQL Academy