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

ข้อจำกัด UNIQUE และคีย์ผสม

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

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

UNIQUE: ไม่อนุญาตให้มีข้อมูลซ้ำ

ข้อจำกัด UNIQUE ห้ามไม่ให้สองแถวมีค่าเดียวกันในคอลัมน์ที่อยู่ภายใต้ข้อจำกัด:

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

UNIQUE สร้างดัชนี

ข้อจำกัด UNIQUE ทำงานด้วยดัชนีต้นไม้ B แบบไม่ซ้ำกัน ดังนั้นการค้นหาด้วยคอลัมน์นั้นจึงทำได้รวดเร็ว

-- This shows the implicit index:
SELECT indexname FROM pg_indexes WHERE tablename = 'users';

UNIQUE แบบประกอบ

ความไม่ซ้ำกันของชุดคอลัมน์ที่ใช้ร่วมกัน:

CREATE TABLE memberships (
  user_id BIGINT NOT NULL,
  group_id BIGINT NOT NULL,
  role TEXT NOT NULL,
  UNIQUE (user_id, group_id)        -- a user can be in a group at most once
);

UNIQUE เทียบกับ PRIMARY KEY

คีย์หลักโดยพื้นฐานคือ UNIQUE + NOT NULL + ตัวระบุที่กำหนดให้เป็นอัตลักษณ์ ตารางหนึ่งมีคีย์หลักได้หนึ่งคีย์ แต่มีข้อจำกัด UNIQUE ได้หลายรายการ

NULL ใน UNIQUE

SQL มาตรฐานถือว่า NULL แตกต่างจากค่าอื่นทุกค่า (รวมถึง NULL อื่น ๆ) คุณจึงมีหลายแถวที่เป็น NULL ในคอลัมน์ UNIQUE ได้:

CREATE TABLE invites (email VARCHAR(255) UNIQUE);
INSERT INTO invites VALUES (NULL), (NULL);   -- both succeed

-- PostgreSQL 15+ offers UNIQUE NULLS NOT DISTINCT to treat NULL as equal:
CREATE TABLE invites2 (email VARCHAR(255) UNIQUE NULLS NOT DISTINCT);

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

หากคีย์ประกอบตามธรรมชาติเหมาะสม ให้ใช้คีย์นั้นเป็น PRIMARY KEY:

CREATE TABLE order_items (
  order_id   BIGINT NOT NULL REFERENCES orders(id) ON DELETE CASCADE,
  product_id BIGINT NOT NULL REFERENCES products(id),
  quantity   INT NOT NULL CHECK (quantity > 0),
  PRIMARY KEY (order_id, product_id)
);

คีย์ทดแทน + คีย์ธรรมชาติแบบ UNIQUE

รูปแบบที่ใช้กันทั่วไป: ใช้รหัสสังเคราะห์เป็นคีย์หลัก และใช้ UNIQUE เพื่อบังคับความไม่ซ้ำกันในโลกจริง:

CREATE TABLE products (
  id BIGSERIAL PRIMARY KEY,
  sku VARCHAR(50) NOT NULL UNIQUE,
  name TEXT NOT NULL
);

ดัชนี UNIQUE บางส่วน

บังคับความไม่ซ้ำกันเฉพาะในบางแถว:

-- One active email per user (deleted users can re-register):
CREATE UNIQUE INDEX users_active_email_idx
  ON users (email)
  WHERE deleted_at IS NULL;

ดัชนี UNIQUE จากนิพจน์

บังคับความไม่ซ้ำกันจากนิพจน์ที่คำนวณแล้ว ซึ่งมีประโยชน์สำหรับอีเมลที่ไม่คำนึงถึงตัวพิมพ์เล็กใหญ่:

CREATE UNIQUE INDEX users_email_ci_idx ON users (LOWER(email));

ข้อผิดพลาดจากการละเมิด UNIQUE

การเพิ่มข้อมูลซ้ำจะส่งกลับ:

ERROR:  duplicate key value violates unique constraint "users_email_key"
DETAIL:  Key (email)=(alice@example.com) already exists.

UPSERT ต่อยอดจาก UNIQUE

ON CONFLICT ต้องใช้ UNIQUE หรือ PRIMARY KEY เป็นเป้าหมาย นี่คือวิธีที่ PostgreSQL รู้ว่าอะไรถือเป็นข้อมูลซ้ำ

สรุป

UNIQUE เป็นข้อจำกัดที่สำคัญเป็นอันดับสองรองจาก NOT NULL

  • แบบคอลัมน์เดียวหรือแบบประกอบ
  • UNIQUE บางส่วนสำหรับ “เฉพาะในแถวที่ยังใช้งานอยู่”
  • UNIQUE จากนิพจน์สำหรับคีย์ที่ไม่คำนึงถึงตัวพิมพ์เล็กใหญ่
  • ระวังกฎที่ว่า NULL ถือว่าแตกต่างกัน

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

คอลัมน์ UNIQUE สามารถมีค่า NULL หลายค่าใน SQL มาตรฐานได้หรือไม่

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

บทเรียน “ข้อจำกัด UNIQUE และคีย์ผสม” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ข้อจำกัด UNIQUE และคีย์ผสม”

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

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

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

บทเรียน “ข้อจำกัด UNIQUE และคีย์ผสม” ใช้เวลานานแค่ไหน

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

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

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

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

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