คีย์หลักและความไม่ซ้ำกัน
ทำความเข้าใจคีย์หลัก คีย์ตัวแทนเทียบกับคีย์ธรรมชาติ คีย์ผสม และเหตุใดทุกแถวต้องมีตัวระบุที่ไม่ซ้ำและเชื่อถือได้
คีย์หลักและความไม่ซ้ำกัน เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- RDBMS คืออะไร และเหตุใดตารางจึงสำคัญ
- คีย์หลักและความไม่ซ้ำกัน
- NULL: ค่าความจริงลำดับที่สาม
- ภาพรวมชนิดข้อมูล: INT VARCHAR DATE BOOLEAN