ข้อจํากัดจะคล้ายกับดัชนี แม้ว่าจะสามารถใช้เพื่อสร้างความสัมพันธ์กับตารางอื่นได้เช่นกัน
คุณใช้ส่วนคําสั่ง CONSTRAINT ในคําสั่ง ALTER TABLE และ CREATE TABLE เพื่อสร้างหรือลบข้อจํากัด ส่วนคําสั่ง CONSTRAINT มีสองชนิด: ชนิดแรกสําหรับสร้างข้อจํากัดบนเขตข้อมูลเดี่ยว และอีกชนิดสําหรับสร้างข้อจํากัดบนหลายเขตข้อมูล
หมายเหตุ
กลไกจัดการฐานข้อมูลของ Microsoft Access ไม่รองรับการใช้คําสั่ง CONSTRAINT หรือคําสั่งภาษากําหนดโครงสร้างข้อมูลใดๆ กับฐานข้อมูลที่ไม่ใช่ Microsoft Access ใช้วิธีการสร้าง DAO แทน
ไวยากรณ์
ข้อจำกัดแบบเขตข้อมูลเดี่ยว:
CONSTRAINT name {PRIMARY KEY | ยูนิค | UNIQUE NOT NULL |
REFERENCES foreigntable [(foreignfield1, foreignfield2)]
[ON UPDATE CASCADE | SET NULL]
[ในลบสิ่งที่เกี่ยวข้อง | SET NULL]}
ข้อจำกัดแบบหลายเขตข้อมูล:
ชื่อข้อจํากัด
{PRIMARY KEY (primary1[, primary2 [, ...]]) |
UNIQUE (unique1[, unique2 [, ...]]) |
NOT NULL (notnull1[, notnull2 [, ...]]) |
FOREIGN KEY [NO INDEX] (ref1[, ref2 [, ...]]) REFERENCES foreigntable [(foreignfield1 [, foreignfield2 [, ...]])]
[ON UPDATE CASCADE | SET NULL]
[ในลบสิ่งที่เกี่ยวข้อง | SET NULL]}
ส่วนคำสั่ง CONSTRAINT มีส่วนต่างๆ ดังนี้:
| ส่วน | คำอธิบาย |
|---|---|
| name | ชื่อของข้อจำกัดที่จะถูกสร้าง |
| primary1, primary2 | ชื่อของหนึ่งหรือหลายเขตข้อมูลที่จะถูกกําหนดเป็นคีย์หลัก |
| unique1, unique2 | ชื่อของหนึ่งหรือหลายเขตข้อมูลที่จะถูกกำหนดเป็นคีย์เฉพาะ |
| notnull1, notnull2 | ชื่อของหนึ่งหรือหลายเขตข้อมูลที่ถูกจำกัดไว้ที่ค่าที่ไม่เป็น Null |
| ref1, ref2 | ชื่อของเขตข้อมูล Foreign Key หรือเขตข้อมูลที่อ้างอิงเขตข้อมูลในตารางอื่น |
| foreigntable | ชื่อของตาราง Foreign ที่มีหนึ่งหรือหลายเขตข้อมูลที่ระบุโดย foreignfield |
| foreignfield1, foreignfield2 | ชื่อของหนึ่งหรือหลายเขตข้อมูลใน foreigntable ที่ระบุโดย ref1, ref2 คุณสามารถละเว้นส่วนคําสั่งนี้ได้ถ้าเขตข้อมูลที่ถูกอ้างอิงเป็นคีย์หลักของ foreigntable |
ข้อสังเกต
คุณใช้ไวยากรณ์สำหรับข้อจำกัดแบบเขตข้อมูลเดี่ยวในส่วนคำสั่งข้อกำหนดเขตข้อมูลของคำสั่ง ALTER TABLE หรือ CREATE TABLE ที่อยู่หลังจากข้อกำหนดของชนิดข้อมูลของเขตข้อมูล
คุณใช้ไวยากรณ์สําหรับข้อจํากัดแบบหลายเขตข้อมูลเมื่อใดก็ตามที่คุณใช้คําสงวน CONSTRAINT ภายนอกส่วนคําสั่งข้อกําหนดเขตข้อมูลในคําสั่ง ALTER TABLE หรือ CREATE TABLE
ด้วยการใช้ CONSTRAINT คุณสามารถกำหนดเขตข้อมูลให้เป็นหนึ่งในชนิดของข้อจำกัดต่อไปนี้ได้:
คุณสามารถใช้คําสงวน UNIQUE เพื่อกําหนดเขตข้อมูลให้เป็นคีย์เฉพาะ ซึ่งหมายความว่า จะไม่มีระเบียนใดๆ ในตารางที่มีค่าเดียวกันในเขตข้อมูลนี้ คุณสามารถจํากัดเขตข้อมูลหรือรายการของเขตข้อมูลใดก็ตามให้เป็นเขตข้อมูลที่ไม่ซ้ํากันได้ ถ้าข้อจํากัดแบบหลายเขตข้อมูลถูกกําหนดให้เป็นคีย์เฉพาะ ค่ารวมของเขตข้อมูลทั้งหมดในดัชนีต้องไม่ซ้ํากัน แม้ว่าระเบียนอย่างน้อยสองระเบียนขึ้นไปมีค่าเดียวกันในหนึ่งเขตข้อมูลก็ตาม
คุณสามารถใช้คําสงวน PRIMARY KEY เพื่อกําหนดหนึ่งเขตข้อมูลหรือชุดของเขตข้อมูลในตารางให้เป็นคีย์หลักได้ ค่าทั้งหมดในคีย์หลักต้องไม่ซ้ํากันและไม่ใช่ Null และสามารถมีได้เพียงคีย์หลักเดียวสําหรับหนึ่งตาราง
หมายเหตุ
อย่าตั้งค่าข้อจำกัด PRIMARY KEY ในตารางที่มีคีย์หลักอยู่แล้ว ข้อผิดพลาดจะเกิดขึ้นถ้าคุณทำเช่นนั้น
คุณสามารถใช้คําสงวน FOREIGN KEY เพื่อกําหนดเขตข้อมูลให้เป็น Foreign Key ถ้าคีย์หลักของตารางภายนอกประกอบด้วยมากกว่าหนึ่งเขตข้อมูล คุณต้องใช้ข้อกําหนดข้อจํากัดแบบหลายเขตข้อมูล ซึ่งแสดงเขตข้อมูลการอ้างอิงทั้งหมด ชื่อของตารางภายนอก และชื่อของเขตข้อมูลที่อ้างอิงในตารางภายนอกในลําดับเดียวกับที่เขตข้อมูลการอ้างอิงถูกแสดงรายการอยู่ ถ้าเขตข้อมูลที่อ้างอิงเป็นคีย์หลักของตารางภายนอก คุณไม่จําเป็นต้องระบุเขตข้อมูลที่อ้างอิงนั้น ตามค่าเริ่มต้น กลไกจัดการฐานข้อมูลจะทํางานเหมือนกับว่าคีย์หลักของตารางภายนอกเป็นเขตข้อมูลที่ถูกอ้างอิง
ข้อจำกัดคีย์นอกกำหนดให้การกระทำบางอย่างถูกดำเนินการเมื่อค่าคีย์หลักที่เกี่ยวข้องถูกเปลี่ยนแปลงคุณสามารถระบุการกระทําที่จะดําเนินการบนตารางภายนอกโดยยึดตามการกระทําที่สอดคล้องกันที่ทําบนคีย์หลักในตารางที่มีการกําหนด CONSTRAINT ตัวอย่างเช่น ให้พิจารณาข้อกําหนดต่อไปนี้สําหรับตาราง Customers:
CREATE TABLE Customers (CustId INTEGER PRIMARY KEY, CLstNm NCHAR VARYING (50))
พิจารณาข้อกำหนดของตาราง Orders ต่อไปนี้ ซึ่งกำหนดความสัมพันธ์คีย์นอกที่อ้างอิงคีย์หลักของตาราง Customers:
CREATE TABLE Orders (OrderId INTEGER PRIMARY KEY, CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES Customers ON UPDATE CASCADE ON DELETE CASCADE
ส่วนคําสั่ง ON UPDATE CASCADE และ ON DELETE CASCADE ถูกกําหนดไว้ในคีย์นอก ส่วนคําสั่ง ON UPDATE CASCADE หมายความว่า ถ้าตัวระบุลูกค้า (CustId) ถูกอัปเดตในตาราง Customers การอัปเดตจะถูกส่งต่อเป็นทอดผ่านตาราง Orders คําสั่งซื้อแต่ละใบที่ประกอบด้วยค่าตัวระบุลูกค้าที่สอดคล้องกันจะถูกอัปเดตเป็นค่าใหม่โดยอัตโนมัติ ส่วนคําสั่ง ON DELETE CASCADE หมายความว่า ถ้าลูกค้าถูกลบออกจากตาราง Customers แถวทั้งหมดในตาราง Orders ที่ประกอบด้วยค่าตัวระบุลูกค้าเดียวกันจะถูกลบไปด้วยเช่นกัน
พิจารณาข้อกำหนดที่แตกต่างกันของตาราง Orders ต่อไปนี้ ซึ่งใช้การกระทำ SET NULL แทน CASCADE:
CREATE TABLE Orders (OrderId INTEGER PRIMARY KEY, CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES Customers ON UPDATE SET NULL ON DELETE SET NULL
ส่วนคําสั่ง ON UPDATE SET NULL หมายความว่า ถ้าตัวระบุลูกค้า (CustId) ถูกอัปเดตในตาราง Customers ค่าคีย์นอกที่สอดคล้องกันในตาราง Orders จะถูกตั้งค่าเป็น NULL โดยอัตโนมัติ ในทํานองเดียวกัน ส่วนคําสั่ง ON DELETE SET NULL หมายความว่า ถ้าลูกค้าถูกลบออกจากตาราง Customers ค่าคีย์นอกทั้งหมดที่สอดคล้องกันในตาราง Orders จะถูกตั้งค่าเป็น NULL โดยอัตโนมัติ
เมื่อต้องการป้องกันไม่ให้มีการสร้างดัชนีสําหรับคีย์นอกโดยอัตโนมัติ คุณสามารถใช้ตัวปรับเปลี่ยน NO INDEX ได้ ฟอร์มของข้อกําหนดคีย์นอกควรถูกใช้เฉพาะในกรณีที่ค่าดัชนีผลลัพธ์มักจะถูกทําซ้ํากันบ่อยเท่านั้น ในที่ที่ค่าในดัชนีคีย์นอกมักถูกทําซ้ํา การใช้ดัชนีอาจมีประสิทธิภาพน้อยกว่าการดําเนินการสแกนตารางเสียด้วยซ้ํา การรักษาดัชนีชนิดนี้ซึ่งมีแถวถูกแทรกและถูกลบออกจากตารางจะลดระดับประสิทธิภาพการทํางานและไม่มีประโยชน์ใดๆ