Ачааллж байна...
Өмнөх хичээлийг нэг асуудалтай таамаглалаар дуусгасан: "ном бүр нэг зохиогчтой." “The Pragmatic Programmer” хоёр зохиогчтой, олон шинжлэх ухааны ном арван зохиогчтой байдаг. Хэрэв ном олон зохиогчтой, зохиогч олон номтой байж болох бол харилцаа хоёр талдаа "олон" болно. Өмнөх хичээлийн "нэг ... нэг" өгүүлбэрийн дүрэм энд ажиллахгүй — аль ч талд "нэг" байхгүй тул FOREIGN KEY-ийн гэр олдохгүй.
Ийм харилцааг олон-олон (many-to-many) гэдэг бөгөөд энэ нь бодит ертөнцөд маш түгээмэл. Энэ хичээлд бид түүнийг таны хамгийн сайн мэдэх жишээгээр судална: сурагчид ба сургалтууд. Нэг сурагч олон сургалтад суралцдаг — та өөрөө энэ цувралын хэд хэдэн сургалтыг дүүргэсэн. Нэг сургалт олон сурагчтай. Энэ харилцааг хадгалах арга бол хоёр хүснэгтийн дунд гурав дахь, тусгай хүснэгт үүсгэх юм — түүнийг холбогч хүснэгт (junction table) гэдэг.
Энэ хүснэгттэй та аль хэдийн нүүр тулсан. Энэ сургалтын хуудсан дээр "Элсэх" товч дарах мөчид платформын өгөгдлийн санд элсэлтийн хүснэгтэд нэг шинэ мөр нэмэгдсэн: "энэ хэрэглэгч, энэ сургалт." Таны ахиц, элссэн огноо бүгд тэр мөрөнд хадгалагддаг. Энэ хичээлийн төгсгөлд та тэр мөр яг ямар хэлбэртэй, яагаад тийм байгааг бүрэн ойлгох болно.
Сургуулийн дугуйлангийн бүртгэлийн хэлтсийг төсөөлөөд үзээрэй. Сурагчдын хувийн хэрэг нэг шүүгээнд, дугуйлангуудын тодорхойлолт нөгөө шүүгээнд байна. Нэг сурагч шатар, хөгжим, програмчлалын дугуйланд зэрэг явдаг; нэг дугуйланд хорин сурагч явдаг. Сурагчийн хувийн хэрэгт "Дугуйлан:" гэсэн ганц нүд тавьж болохгүй — тэр гурван дугуйланд явдаг. Дугуйлангийн тодорхойлолтод "Сурагч:" гэсэн ганц нүд тавьж болохгүй — тэнд хорин сурагч бий.
Ухаалаг бүртгэлч тусдаа гурав дахь дэвтэр нээдэг: "Бүртгэл." Мөр бүрт яг хоёр заалт ба огноо: "Сурагч №1, Дугуйлан №3, 9-р сарын 15." Бат гурван дугуйланд явдаг бол гурван мөр, шатрын дугуйлан хорин сурагчтай бол хорин мөр. Мөр бүр жижиг бөгөөд нэг л баримтыг тэмдэглэнэ: нэг хүн нэг дугуйланд бүртгүүлсэн. Сурагчийн шүүгээ ч, дугуйлангийн шүүгээ ч огт өөрчлөгдөөгүй — бүх харилцаа шинэ дэвтэрт амьдарна.
library.db-г нээгээд хоёр хүснэгт үүсгэе (энэ хичээлийн турш Write Changes дарахгүй):
sql
CREATE TABLE students (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE courses (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL
);
INSERT INTO students (name)
VALUES ('Бат'), ('Сараа'), ('Тэмүүлэн'), ('Номин');
INSERT INTO courses (title)
VALUES ('Python анхан шат'), ('FastAPI'), ('SQL'), ('Git ба хэрэгсэл');Хүснэгтүүд:
students courses
id | name id | title
---+--------- ---+-----------------
1 | Бат 1 | Python анхан шат
2 | Сараа 2 | FastAPI
3 | Тэмүүлэн 3 | SQL
4 | Номин 4 | Git ба хэрэгсэлЭнэ тушаалууд юу гэж хэлж байна вэ гэвэл: "сурагчид болон сургалтуудын хоёр энгийн хүснэгт үүсгэж, тус бүрд дөрвөн мөр нэм." Анзаарвал аль ч хүснэгтэд нөгөө рүүгээ заасан багана байхгүй. Энэ нь санаатай — эхлээд яагаад ингэх ёстойг харъя.
Өмнөх хичээлийн аргаар оролдож үзье. Хэрэв students хүснэгтэд course_id нэмбэл сурагч бүр ганц сургалт руу заана. Бат гурван сургалтад суралцдаг — түүнийг гурван удаа бичих шаардлагатай болж, өмнөх хичээлийн Буруу хувилбар 1-ийн давхардал буцаж ирнэ. Хэрэв эсрэгээр courses хүснэгтэд student_id нэмбэл сургалт бүр ганц сурагчтай болно — “Python анхан шат” гурван сурагчтай тул тэр нь гурван удаа бичигдэнэ. Аль ч талд заалт тавьсан, нөгөө тал нь давхардана.
Өмнөх хичээлийн "нэг ... нэг" өгүүлбэрийн шалгалтаар үүнийг нотолж болно. "Нэг сурагч нэг сургалтад суралцдаг уу?" Үгүй — олон. "Нэг сургалт нэг сурагчтай юу?" Үгүй — олон. Хоёр өгүүлбэр хоёулаа "олон"-оор төгссөн тул хоёр хүснэгтийн аль нь ч FOREIGN KEY-ийн гэр болж чадахгүй. Мөн нэг нүдэнд жагсаалт бичих ('1,2,3') нь яагаад эвдэрдгийг бид өмнөх хичээлд нарийвчлан харсан.
Зүйрлэлийн "Бүртгэл" дэвтрийг үүсгэе. Query:
sql
CREATE TABLE enrollments (
student_id INTEGER NOT NULL,
course_id INTEGER NOT NULL,
enrolled_on TEXT NOT NULL,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students (id),
FOREIGN KEY (course_id) REFERENCES courses (id)
);Энэ тушаал юу гэж хэлж байна вэ гэвэл: “enrollments хүснэгт үүсгэ. Мөр бүр хоосон байж болохгүй student_id, course_id болон элссэн огноотой. Сурагч ба сургалтын хослол нь мөрийн түлхүүр — өөрөөр хэлбэл нэг сурагч нэг сургалтад нэг л удаа бүртгэгдэнэ. student_id нь students руу, course_id нь courses руу заана.”
Энэ хүснэгтийн бүтцийг анхааралтай ажиглая. Хоёр FOREIGN KEY-тэй — тал бүр рүү нэг. Мөр бүр яг нэг сурагч, яг нэг сургалт руу заадаг. Өөрөөр хэлбэл олон-олон харилцаа нь хоёр нэг-олон харилцаа болж задарсан: нэг сурагч олон бүртгэлтэй, бүртгэл бүр нэг сурагчтай; нэг сургалт олон бүртгэлтэй, бүртгэл бүр нэг сургалттай. Өмнөх хичээлийн дүрмээр хоёр харилцааны "олон" тал хоёулаа enrollments — тиймээс хоёр FOREIGN KEY хоёулаа энд амьдарна. Холбогч хүснэгт ямар ч шинэ дүрэм нэвтрүүлээгүй, харин бидний мэдэх дүрмийг хоёр удаа хэрэглэсэн.
Бүлэг 4-ийн PRIMARY KEY хичээлд "нэг түлхүүр нэгээс олон баганаас бүрдэж болох бөгөөд үүнийг Бүлэг 5-д харна" гэж хэлсэн. PRIMARY KEY (student_id, course_id) бол тэр нийлмэл түлхүүр (composite key) юм. Тусдаа id багана үүсгэсэнгүй, учир нь сурагч ба сургалтын хослол аль хэдийн мөрийг бүрэн тодорхойлж байна: "Бат FastAPI-д" гэсэн бүртгэл нэг л байх ёстой. Энэ түлхүүр нь давхар элсэлтийг хориглох хоёр дахь үүргийг ч давхар гүйцэтгэнэ — доор харна.
Одоо бүртгэлүүдийг нэмье:
sql
INSERT INTO enrollments (student_id, course_id, enrolled_on)
VALUES
(1, 1, '2026-01-10'),
(1, 2, '2026-03-02'),
(1, 3, '2026-09-15'),
(2, 1, '2026-02-05'),
(2, 3, '2026-09-20'),
(3, 1, '2026-04-11');enrollments хүснэгт:
student_id | course_id | enrolled_on
-----------+-----------+-----------
1 | 1 | 2026-01-10
1 | 2 | 2026-03-02
1 | 3 | 2026-09-15
2 | 1 | 2026-02-05
2 | 3 | 2026-09-20
3 | 1 | 2026-04-11Энэ query юу гэж хэлж байна вэ гэвэл: “enrollments хүснэгтэд зургаан бүртгэл нэм.” Мөр бүрийг өгүүлбэр болгон уншиж болно: эхний мөр — "Бат Python анхан шатад 1-р сарын 10-нд элссэн." Бат гурван мөр, Сараа хоёр, Тэмүүлэн нэг мөртэй. Номин (4) нэг ч мөргүй — тэр бүртгэлтэй ч хараахан сургалтад элсээгүй. “Git ба хэрэгсэл” (4) ч мөн нэг ч мөргүй. Өмнөх хичээлийн номгүй зохиогчийн нэгэн адил тэд байгалиараа оршиж байна, ямар нэг тусгай зохицуулалт хэрэггүй.
Жишээ 1: нэг сурагчийн сургалтууд
Бат ямар сургалтад суралцдаг вэ? Холбогч хүснэгтээс эхэлнэ. Query:
sql
SELECT course_id
FROM enrollments
WHERE student_id = 1;Үр дүн:
course_id
---------
1
2
3Энэ query юу гэж хэлж байна вэ гэвэл: “enrollments хүснэгтээс student_id нь 1 байгаа мөрүүдийн course_id-г харуул.” Бид гурван дугаар авлаа. Одоо тэдгээрийг нэр болгоно — Бүлэг 2-ын IN хичээлийн хэрэгсэл энд маш тохиромжтой:
sql
SELECT title
FROM courses
WHERE id IN (1, 2, 3);Үр дүн:
title
----------------
Python анхан шат
FastAPI
SQLЭнэ query юу гэж хэлж байна вэ гэвэл: “courses хүснэгтээс id нь 1, 2, 3-ын аль нэг байгаа мөрүүдийн title-ийг харуул.” Хоёр алхмаар бид "Батын сургалтууд" гэсэн асуултад хариуллаа. Эхний query-ний үр дүнг хоёр дахь query руу гараар хуулсныг анзаараарай. Бүлэг 9-д эхний query-г хоёр дахин дотор нь шууд байрлуулах (subquery), Бүлэг 7-д хоёр хүснэгтийг нэг дор холбох (JOIN) аргыг сурна — хоёулаа энэ гар ажлыг арилгана.
Жишээ 2: нэг сургалтын сурагчид
Одоо эсрэг чиглэлд асууя: SQL сургалтад хэн хэн суралцдаг вэ? Query:
sql
SELECT student_id
FROM enrollments
WHERE course_id = 3;Үр дүн:
student_id
----------
1
2Энэ query юу гэж хэлж байна вэ гэвэл: “enrollments хүснэгтээс course_id нь 3 байгаа мөрүүдийн student_id-г харуул.” Дараа нь SELECT name FROM students WHERE id IN (1, 2); нь "Бат", "Сараа"-г буцаана. Хоёр чиглэлийн асуулт хоёулаа яг ижил хэлбэртэй байгааг анзаараарай: холбогч хүснэгтийг нэг заалтаар нь шүүж, нөгөө заалтыг нь авна. Холбогч хүснэгт аль ч талыг давуу эрхтэй болгодоггүй — энэ бол олон-олон харилцааны тэгш хэм юм.
Жишээ 3: давхар элсэлтийг хориглох
Бат FastAPI-д дахин элсэх гэж оролдлоо — магадгүй "Элсэх" товчийг хоёр удаа дарсан. Query:
sql
INSERT INTO enrollments (student_id, course_id, enrolled_on)
VALUES (1, 2, '2026-10-01');Үр дүн:
UNIQUE constraint failed: enrollments.student_id, enrollments.course_idЭнэ мессеж юу гэж хэлж байна вэ гэвэл: “enrollments хүснэгтийн student_id ба course_id-ийн хослол давхардахгүй байх дүрэм зөрчигдлөө.” Нийлмэл PRIMARY KEY нь Бүлэг 4-ийн UNIQUE (title, event_date)-тэй яг ижил зарчмаар ажилласан: Бат (1) өөр сургалтад элсэж болно, FastAPI (2) өөр сурагчийг хүлээн авч болно, гэвч энэ хоёрын хослол аль хэдийн байгаа. Хэрэв бид тусдаа id багана хэрэглээд нийлмэл түлхүүргүй үлдээсэн бол энэ INSERT амжилттай болж, Бат FastAPI-д хоёр удаа "элссэн" байх байсан — тэгээд “FastAPI хэдэн сурагчтай вэ” гэсэн асуулт худал хариу өгөх байсан.
Шударга нэг нэмэлт тайлбар: олон бодит систем холбогч хүснэгтэд ч тусдаа id багана өгдөг — жишээ нь энэ платформын элсэлтийн хүснэгт өөрийн давтагдашгүй дугаартай. Энэ нь буруу биш: элсэлтийг өөр хүснэгтээс заах, вэб хаягт ашиглах шаардлагатай үед тусдаа id тохиромжтой. Гэхдээ ийм үед давхардлыг хориглохын тулд UNIQUE (student_id, course_id)-г тусад нь тавих хэрэгтэй. Аль хэлбэрийг сонгосон ч "нэг хослол — нэг мөр" гэдэг дүрэм хаа нэгтээ хуульчлагдсан байх ёстой.
Жишээ 4: холбогч хүснэгт ч FOREIGN KEY-ийн хамгаалалттай
Байхгүй сурагчийг элсүүлэх гэж оролдъё. Query:
sql
INSERT INTO enrollments (student_id, course_id, enrolled_on)
VALUES (9, 3, '2026-10-01');Үр дүн:
FOREIGN KEY constraint failedЭнэ мессеж юу гэж хэлж байна вэ гэвэл: "гадаад түлхүүрийн дүрэм зөрчигдлөө" — students хүснэгтэд 9-р сурагч байхгүй. Холбогч хүснэгтийн хоёр заалт хоёулаа Бүлэг 5-ийн эхний хичээлийн бүх хамгаалалтыг авч байна: өнчин бүртгэл төрөхгүй, бүртгэлтэй сурагчийг эсвэл сургалтыг устгах боломжгүй (одоохондоо — дараагийн хичээлд энэ зан чанарыг өөрчлөх аргыг сурна).
Холбогч хүснэгтийн нэг гайхалтай чанар бий. Бид enrolled_on баганыг тэнд тавьсан — яагаад сурагчийн эсвэл сургалтын хүснэгтэд биш вэ? Учир нь элссэн огноо сурагчийн шинж чанар биш (Бат олон өөр огноонд элссэн), сургалтын шинж чанар ч биш (FastAPI-д олон хүн өөр өөр огноонд элссэн). Энэ бол тэр хоёрын харилцааны шинж чанар: "Бат FastAPI-д хэзээ элссэн бэ." Ийм мэдээлэл холбогч хүснэгтээс өөр газар багтахгүй.
Энэ санааг цааш нь үргэлжлүүлбэл холбогч хүснэгт ердийн "холбоос"-оос хүснэгт болж хувирна. Бодит элсэлтийн хүснэгтэд ахицын хувь, төлөв (идэвхтэй, дүүргэсэн, орхисон), дүүргэсэн огноо зэрэг баганууд байдаг — бүгд "энэ сурагч энэ сургалтад" гэдэг харилцааны мэдээлэл. Тиймээс холбогч хүснэгтийг механик нэрээр (student_courses) биш, харилцааны утгыг илэрхийлсэн нэрээр нэрлэх нь сайн дадал: элсэлт (enrollments), зээл (loans), гишүүнчлэл (memberships). Өмнөх хичээлийн loans хүснэгтийг санаж байна уу? Тэр нь номнууд ба гишүүдийн хоорондох олон-олон харилцааны холбогч хүснэгт байсан — нэг ном олон гишүүнд зээлэгддэг, нэг гишүүн олон ном зээлдэг. Та холбогч хүснэгт гэдэг нэрийг мэдэлгүйгээр аль хэдийн нэгийг бүтээжээ.
Жишээ 1-д бид "Батын сургалтууд"-ыг хоёр алхам, гараар хуулсан дугааруудаар олсон. Бүх сурагчийн бүх сургалтыг нэрээр нь харахыг хүсвэл юу болох вэ? Гар аргаар бол сурагч бүрт хоёр query — зөвхөн дөрвөн сурагчид найман query. Энд Түвшин 3-ын эхний бүлгийн хүчийг урьдчилан харуулъя. Доорх query-ний бичлэгийг одоо ойлгох шаардлагагүй — Бүлэг 7-д мөр бүрийг нь задална. Зөвхөн үр дүнг хараарай:
sql
SELECT students.name, courses.title
FROM enrollments
JOIN students ON students.id = enrollments.student_id
JOIN courses ON courses.id = enrollments.course_id
ORDER BY students.name, courses.title;Үр дүн:
name | title
---------+-----------------
Бат | FastAPI
Бат | Python анхан шат
Бат | SQL
Сараа | Python анхан шат
Сараа | SQL
Тэмүүлэн | Python анхан шатЭнэ query юу гэж хэлж байна вэ гэвэл (ерөнхийд нь): "бүртгэл бүрийг аваад, түүний student_id-ийн дагуу сурагчийн нэрийг, course_id-ийн дагуу сургалтын нэрийг зэрэгцүүлж, сурагч болон сургалтын нэрээр эрэмбэлж харуул." Нэг query, зургаан мөр, дугаар нэг ч алга — зөвхөн хүнд ойлгомжтой нэрс. Энэ бол холбогч хүснэгт ба FOREIGN KEY-ийн жинхэнэ шагнал: бид өгөгдлийг давхардалгүй, цэгцтэй хадгалж, харин унших үедээ хүссэнээрээ нэгтгэдэг. Номин болон “Git ба хэрэгсэл” энэ үр дүнд алга байгааг анзаараарай — тэд бүртгэлгүй. Тэднийг ч хамт харуулах аргыг Бүлэг 7-ын LEFT JOIN хичээл заана.
Өмнөх хичээлийн асуудал одоо шийдэгдэж байна. Ном олон зохиогчтой байж болох бол works хүснэгтээс author_id-г хасаад, холбогч хүснэгт үүсгэнэ:
book_authors
work_id | author_id
--------+----------
4 | 3
9 | 6
9 | 7Хэрэв 9-р бүтээл “The Pragmatic Programmer”, 6-р зохиогч Andrew Hunt, 7-р нь David Thomas байсан бол энэ ном хоёр мөр, хоёр зохиогчтой болно — нэг нүдэнд хоёр нэр бичих шаардлага бүрмөсөн алга болсон. Хүснэгт зохиохдоо асуух асуулт өөрчлөгдлөө: "нэг-олон уу, олон-олон уу?" Хоёр "нэг ... нэг" өгүүлбэрийн аль нэг нь "нэг"-ээр төгсвөл FOREIGN KEY-г тэр талд тавина; хоёулаа "олон"-оор төгсвөл холбогч хүснэгт үүсгэнэ.
Бид Write Changes дараагүй тул Revert Changes дарахад students, courses, enrollments хүснэгтүүд алга болно. Database Structure табд зөвхөн books, members үлдсэн эсэхийг шалгаарай.
Хэрэв сонирхож байвал хүснэгтүүдийг дахин үүсгээд Номиныг “Git ба хэрэгсэл” сургалтад элсүүлж, Урьдчилсан харагдацын query-г дахин ажиллуулж үр дүн хэрхэн өөрчлөгдөхийг хараарай. Мөн enrollments-д progress INTEGER NOT NULL DEFAULT 0 CHECK (progress BETWEEN 0 AND 100) гэсэн багана нэмж (Бүлэг 4-ийн ALTER хичээлийн дагуу), Батын FastAPI-ийн ахицыг 50 болгож UPDATE хийж болно — UPDATE-ийн WHERE-д хоёр баганыг хоёуланг нь зааж байж нэг мөрийг онилохыг анзаараарай. Дуусаад Revert Changes дарна. Эдгээр нь зөвхөн санал бөгөөд дараагийн хичээлүүд тэдгээрийг хийсэн гэж тооцохгүй.
Давхардлын хамгаалалтгүй холбогч хүснэгт. Хэрэв холбогч хүснэгтийг тусдаа id-тай, гэхдээ нийлмэл PRIMARY KEY эсвэл UNIQUE (student_id, course_id)-гүйгээр үүсгэвэл давхар бүртгэл чимээгүйхэн нэмэгдэнэ. Алдааны мессеж гарахгүй, харин тоолол худал болно. Холбогч хүснэгт бүрт "нэг хослол нэг удаа л байх ёстой юу?" гэж асуугаарай. Ихэнхдээ хариулт нь тийм — гэхдээ үргэлж биш: хэрэв гишүүн нэг номыг хэд хэдэн удаа зээлж болох бол loans хүснэгтэд (book_id, member_id) хослол давтагдах ёстой бөгөөд тэнд тусдаа id зөв сонголт.
Харилцааны мэдээллийг буруу хүснэгтэд тавих. enrolled_on-ийг students хүснэгтэд тавибал сурагч бүр ганц элссэн огноотой болно — гэтэл Бат гурван өөр огноонд элссэн. Энэ үед алдааны мессеж гарахгүй, зүгээр л мэдээлэл алдагдана. "Энэ мэдээлэл хэний шинж чанар вэ — сурагчийнх уу, сургалтынх уу, эсвэл тэдгээрийн харилцааных уу?" гэж асуух нь зөв байрыг олох түлхүүр.
Холбогч хүснэгтэд FOREIGN KEY тавихаа мартах. FOREIGN KEY-гүйгээр enrollments (9, 3, ...) гэх мэт байхгүй сурагчийн бүртгэл алдаагүй нэмэгдэнэ. Холбогч хүснэгт нь хоёр заалтаас бүрддэг тул хоёр FOREIGN KEY хоёулаа зайлшгүй.
Бүртгэлтэй сурагчийг устгах. DELETE FROM students WHERE id = 1; нь FOREIGN KEY constraint failed гэсэн алдаа өгнө. Энэ мессеж юу гэж хэлж байна вэ гэвэл: "гадаад түлхүүрийн дүрэм зөрчигдлөө" — Батын гурван бүртгэл түүн рүү заасаар байна. Эхлээд түүний бүртгэлүүдийг (DELETE FROM enrollments WHERE student_id = 1;), дараа нь сурагчийг устгах эсвэл энэ дарааллыг автомат болгох нь дараагийн хичээлийн сэдэв.
Нийлмэл түлхүүртэй мөрийг ганц баганаар онилох. UPDATE enrollments SET enrolled_on = '2026-01-11' WHERE student_id = 1; гэж бичвэл Батын гурван бүртгэл бүгд өөрчлөгдөнө — мессеж 3 rows affected гэж хэлнэ. Нийлмэл түлхүүртэй хүснэгтэд нэг мөрийг онилохын тулд түлхүүрийн бүх баганыг WHERE-д бичих хэрэгтэй: WHERE student_id = 1 AND course_id = 1. Бүлэг 3-ын "эхлээд SELECT" дадал энэ алдааг тэр даруй илрүүлнэ.
Энэ хичээлд та олон-олон харилцааг холбогч хүснэгтээр хадгалж сурлаа. "Нэг ... нэг" өгүүлбэрүүд хоёулаа "олон"-оор төгсөх үед FOREIGN KEY аль ч талд багтахгүй тул тэр хоёрын дунд гурав дахь хүснэгт үүсгэж, хоёр тал руу тус бүр нэг FOREIGN KEY тавина — олон-олон харилцаа хоёр нэг-олон харилцаа болж задарна. Нийлмэл PRIMARY KEY (эсвэл тусдаа id ба UNIQUE хослол) давхар бүртгэлийг хориглодог. Холбогч хүснэгт нь харилцааны өөрийн мэдээллийг — элссэн огноо, ахиц, төлөв — хадгалах цорын ганц зөв газар бөгөөд тиймээс утгатай нэрээр нэрлэх нь зохимжтой. Холбогч хүснэгтээр дамжин уншихад одоогоор хоёр алхам хэрэгтэй ч JOIN үүнийг нэг query болгоно.
Дараагийн хичээлээр Бүлэг 5 дуусна. Бид энэ бүлгийн турш гарч ирсэн нэг асуудалд эцсийн хариулт өгнө: заагдаж буй мөрийг устгах гэхэд FOREIGN KEY хориглодог — гэтэл бодит амьдралд сурагч бүртгэлээ цуцалдаг, сургалт хаагддаг. Ийм үед заалттай мөрүүдийг юу хийх вэ? ON DELETE-ийн гурван хариулт — хориглох, хамт устгах, заалтыг хоосон болгох — тус бүрийг өгөгдлөөр харуулна.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.