บังคับใช้ความสมบูรณ์ของข้อมูลด้วยข้อจํากัด
ข้อจํากัดและวัตถุลําดับเป็นตัวเลือกการออกแบบที่ป้องกันปัญหาข้อมูลก่อนที่จะเกิดขึ้น ข้อจํากัดของคีย์นอกที่ขาดหายไปหมายความว่าระเบียนที่ไม่ได้ใช้งานอาจมีอยู่ในฐานข้อมูลของคุณอยู่แล้ว การเพิ่มออบเจ็กต์ลําดับในภายหลังเพื่อแทนที่คอลัมน์ข้อมูลประจําตัวจําเป็นต้องมีการเปลี่ยนแปลงในแอปพลิเคชันทั้งหมด โค้ดแอปพลิเคชันสามารถตรวจสอบความถูกต้องของข้อมูลได้ แต่ผู้ใช้สามารถข้ามข้อมูลผ่านการนําเข้าจํานวนมาก การสืบค้นโดยตรง หรือแอปพลิเคชันใหม่ที่ข้ามการตรวจสอบความถูกต้อง
ข้อจํากัดของฐานข้อมูลบังคับใช้กฎในระดับกลไกจัดการ ดังนั้นจึงมีผลบังคับใช้เสมอ การตัดสินใจที่คุณทําในระหว่างการออกแบบ เช่น กฎที่จะบังคับใช้ในฐานข้อมูล และจะใช้คอลัมน์หรือลําดับข้อมูลประจําตัว จะส่งผลต่อคุณภาพข้อมูลของคุณตลอดอายุการใช้งานของแอปพลิเคชันของคุณ
ทําความเข้าใจว่าเมื่อใดควรใช้ข้อจํากัด
ปัญหาคุณภาพข้อมูลมีราคาแพง คุณภาพของข้อมูลที่ไม่ดีนําไปสู่การตัดสินใจทางธุรกิจที่ไม่ถูกต้องการผสานรวมที่ล้มเหลวและการละเมิดการปฏิบัติตามข้อกําหนด ซึ่งแตกต่างจากการตรวจสอบระดับแอปพลิเคชันที่อาจไม่สอดคล้องกันในแอปพลิเคชันต่างๆ ที่เข้าถึงฐานข้อมูลเดียวกัน ข้อจํากัดจะบังคับใช้กฎในระดับกลไกฐานข้อมูล ซึ่งไม่สามารถข้ามได้ด้วยโค้ดแอปพลิเคชัน การสืบค้นเฉพาะกิจ สคริปต์ SQL โดยตรง หรือการนําเข้าจํานวนมาก
INSERTทุก , UPDATEและDELETEการดําเนินการต้องเป็นไปตามข้อจํากัดที่กําหนดไว้ทั้งหมดก่อนที่กลไกจัดการฐานข้อมูลจะยอมรับการเปลี่ยนแปลง
ใช้ข้อจํากัดของฐานข้อมูล
ข้อจํากัดจะป้องกันปัญหาคุณภาพข้อมูลก่อนที่จะทําให้ฐานข้อมูลของคุณเสียหาย ตารางต่อไปนี้แสดงให้เห็นว่าข้อจํากัดแต่ละชนิดจัดการกับปัญหาความสมบูรณ์ของข้อมูลที่เฉพาะเจาะจงอย่างไร:
| ปัญหา | ข้อจํากัด | ตัวอย่าง |
|---|---|---|
| ระเบียนกําพร้า | คีย์ต่างประเทศ | ป้องกันคําสั่งซื้อที่ไม่มีลูกค้าที่ถูกต้อง |
| ข้อมูลที่ซ้ํากัน | ยูนิค | หยุดการลงทะเบียนอีเมลที่ซ้ํากัน |
| ข้อมูลไม่ถูกต้อง | ตรวจสอบ | ปฏิเสธราคาติดลบหรือวันเกิดในอนาคต |
| ข้อมูลสําคัญหายไป | ไม่เป็นโมฆะ | ป้องกันเรกคอร์ดที่ไม่สมบูรณ์ |
| ความไม่สอดคล้องกันของการอ้างอิง | คีย์ต่างประเทศ | รักษาความสมบูรณ์ของข้อมูลในตารางต่างๆ |
พิจารณาบริษัทค้าปลีกที่ไม่ได้กําหนดข้อจํากัดเฉพาะในคอลัมน์อีเมลของลูกค้า เมื่อเวลาผ่านไป ลูกค้ารายเดียวกันได้รับการลงทะเบียนหลายครั้งด้วยที่อยู่อีเมลที่เหมือนกัน เมื่อการตลาดส่งแคมเปญส่งเสริมการขายลูกค้าบางรายได้รับสําเนาอีเมลเดียวกันสามชุดซึ่งเพิ่มต้นทุนและทําลายความไว้วางใจของลูกค้า การเพิ่ม UNIQUE (EmailAddress) คําจํากัดความของตารางจะป้องกันไม่ให้มีการแทรกรายการที่ซ้ํากันเหล่านี้
ข้อจํากัดบังคับใช้กฎในระดับกลไกฐานข้อมูล เพื่อให้มั่นใจในคุณภาพของข้อมูลไม่ว่าข้อมูลจะเข้าสู่ระบบอย่างไร การตรวจสอบความถูกต้องของแอปพลิเคชันสามารถข้ามได้ แตกต่างกันไปตามแอปพลิเคชัน และยากต่อการบํารุงรักษา ข้อจํากัดของฐานข้อมูลจะถูกบังคับใช้ รวมศูนย์ และให้แหล่งข้อมูลเดียวเสมอ
ข้อจํากัดช่วยให้มั่นใจได้ถึงคุณภาพและความสอดคล้องของข้อมูลในระดับฐานข้อมูล
ใช้ข้อจํากัดคีย์หลัก
ข้อจํากัดของคีย์หลัก รับประกันข้อมูลที่ไม่ซ้ํากันและบังคับใช้ความสมบูรณ์ของเอนทิตี เมื่อคุณระบุข้อจํากัดของคีย์หลัก กลไกจัดการฐานข้อมูลจะสร้างดัชนีที่ไม่ซ้ํากันสําหรับคอลัมน์คีย์หลักโดยอัตโนมัติ ตารางสามารถมีข้อจํากัดคีย์หลักได้เพียงข้อเดียว และคอลัมน์ทั้งหมดที่กําหนดไว้ภายในข้อจํากัดของคีย์หลักต้องถูกกําหนดเป็นNOT NULL
คุณสามารถสร้างคีย์หลักได้โดยใช้ PRIMARY KEY ข้อจํากัด ตัวอย่างมีดังนี้:
CREATE TABLE Customer (
CustomerID INT PRIMARY KEY IDENTITY(1,1),
EmailAddress NVARCHAR(100) NOT NULL
);
ใช้ข้อจํากัดของคีย์ต่างประเทศ
ข้อจํากัดของคีย์นอก บังคับใช้ความสมบูรณ์ของการอ้างอิงโดยการควบคุมข้อมูลที่สามารถจัดเก็บไว้ในตารางคีย์นอก ข้อจํากัดของคีย์นอกจะป้องกันการเปลี่ยนแปลงข้อมูลในตารางคีย์หลักหากการเปลี่ยนแปลงเหล่านั้นทําให้ลิงก์ไปยังข้อมูลในตารางคีย์นอกเป็นโมฆะ
คุณสามารถกําหนด การดําเนินการอ้างอิงแบบเรียงซ้อน เช่น CASCADE, SET NULLหรือ SET DEFAULT เพื่อระบุสิ่งที่จะเกิดขึ้นเมื่อผู้ใช้พยายามลบหรืออัปเดตคีย์ที่คีย์นอกที่มีอยู่ชี้ไป แม้ว่าไม่จําเป็นต้องสร้าง ดัชนีบนคอลัมน์ Foreign Key ด้วยตนเอง แต่ก็มักจะมีประโยชน์เนื่องจากคอลัมน์ Foreign Key มักใช้ในเกณฑ์การรวม
คุณสามารถสร้างคีย์นอกได้โดยใช้ FOREIGN KEY ข้อจํากัดกับ REFERENCES ส่วนคําสั่ง ตัวอย่างมีดังนี้:
CREATE TABLE Order (
OrderID INT PRIMARY KEY IDENTITY,
CustomerID INT NOT NULL,
OrderDate DATETIME2,
FOREIGN KEY (CustomerID) REFERENCES Customer(CustomerID)
);
ใช้ข้อจํากัดเฉพาะ
ข้อจํากัดที่ไม่ซ้ํากัน ช่วยให้แน่ใจว่าไม่มีการป้อนค่าที่ซ้ํากันในคอลัมน์เฉพาะที่ไม่ได้มีส่วนร่วมในคีย์หลัก ซึ่งแตกต่างจาก PRIMARY KEY ข้อ จํากัด ข้อ UNIQUE จํากัด อนุญาตให้มีค่า NULL. อย่างไรก็ตาม เช่นเดียวกับค่าใดๆ ที่เข้าร่วมใน UNIQUE ข้อจํากัด ค่า Null เพียงค่าเดียวเท่านั้นที่ได้รับอนุญาตต่อคอลัมน์ กลไกจัดการฐานข้อมูลจะสร้างดัชนีที่ไม่คลัสเตอร์ที่ไม่ซ้ํากันโดยอัตโนมัติเพื่อบังคับใช้ข้อกําหนดความเป็นเอกลักษณ์
คุณสามารถสร้างข้อจํากัดที่ไม่ซ้ํากันได้โดยใช้ UNIQUE คําหลัก ตัวอย่างมีดังนี้:
CREATE TABLE Product (
ProductID INT PRIMARY KEY,
SKU NVARCHAR(50) UNIQUE,
ProductName NVARCHAR(100)
);
ใช้ข้อจํากัดการตรวจสอบ
ข้อจํากัดของการตรวจสอบ จะบังคับใช้ความสมบูรณ์ของโดเมนโดยการจํากัดค่าที่ยอมรับโดยคอลัมน์อย่างน้อยหนึ่งคอลัมน์ คุณสามารถสร้าง CHECK ข้อจํากัดด้วยนิพจน์เชิงตรรกะใดๆ ที่ส่งกลับ TRUE หรือ FALSE ยึดตามตัวดําเนินการเชิงตรรกะ คุณสามารถใช้ข้อจํากัดหลายรายการ CHECK กับคอลัมน์เดียว หรือใช้ข้อจํากัดเดียว CHECK กับหลายคอลัมน์
เนื่องจากค่า Null ประเมินเป็น UNKNOWNการมีอยู่ในนิพจน์อาจแทนที่ข้อจํากัด ตัวอย่างเช่น ข้อจํากัดMyColumn = 10ในINTคอลัมน์ยังคงอนุญาตให้NULLแทรกได้เนื่องจากNULLไม่ได้ประเมินเป็นFALSE
คุณสามารถสร้างข้อจํากัด CHECK ได้โดยใช้ CHECK คําสําคัญที่มีนิพจน์เชิงตรรกะ ตัวอย่างมีดังนี้:
CREATE TABLE Employee (
EmployeeID INT PRIMARY KEY,
HireDate DATE,
Salary DECIMAL(10,2),
CHECK (Salary >= 20000),
CHECK (HireDate <= GETDATE())
);
ใช้ข้อจํากัดเริ่มต้น
ข้อจํากัดดีฟอลต์ จะให้ค่าดีฟอลต์เมื่อไม่มีการระบุค่าระหว่าง INSERT การดําเนินการ เมื่อทํางานกับโครงการฐานข้อมูล ขอแนะนําให้สร้างข้อจํากัดด้วยชื่อที่ชัดเจนแทนที่จะอนุญาตชื่อที่ระบบสร้างขึ้น ซึ่งแตกต่างกันไปในแต่ละสภาพแวดล้อม
คุณสามารถสร้างข้อจํากัด DEFAULT ได้โดยใช้ DEFAULT คําสําคัญ ตัวอย่างมีดังนี้:
CREATE TABLE Activity (
ActivityID INT PRIMARY KEY IDENTITY,
Description NVARCHAR(200),
CreatedDate DATETIME2 CONSTRAINT DF_Activity_CreatedDate DEFAULT GETUTCDATE(),
IsActive BIT CONSTRAINT DF_Activity_IsActive DEFAULT 1
);
ใช้ออบเจ็กต์ลําดับ
ออบเจ็กต์ลําดับคือออบเจ็กต์ที่ผูกกับสคีมาที่ผู้ใช้กําหนด ซึ่งสร้างลําดับของค่าตัวเลขตามข้อกําหนดที่สร้างลําดับ ซึ่งแตกต่างจากคอลัมน์ข้อมูลประจําตัว ลําดับจะไม่เชื่อมโยงกับตารางเฉพาะ แอ็พพลิเคชันอ้างถึงออบเจ็กต์ลําดับเพื่อดึงค่าถัดไป และความสัมพันธ์ระหว่างลําดับและตารางจะถูกควบคุมโดยแอ็พพลิเคชัน
คอลัมน์ข้อมูลประจําตัวจะทํางานได้ดีเมื่อคุณต้องการการกําหนดหมายเลขอัตโนมัติสําหรับตารางเดียว อย่างไรก็ตาม พวกเขาจํากัดอยู่ที่โต๊ะเดียว คุณไม่สามารถแชร์ตัวเลขในหลายตาราง รับค่าถัดไปก่อนแทรกแถว หรือรีเซ็ตตัวนับได้อย่างง่ายดาย วัตถุลําดับแก้ปัญหาเหล่านี้โดยการสร้างตัวเลขโดยไม่ขึ้นกับตารางใดๆ
ทําความเข้าใจว่าเมื่อใดควรใช้ลําดับ
ใช้ลําดับแทนคอลัมน์ข้อมูลประจําตัวในสถานการณ์ต่อไปนี้:
- ชุดตัวเลขที่ใช้ร่วมกัน - แอปพลิเคชันต้องการการแชร์ชุดตัวเลขเดียวระหว่างหลายตารางหรือหลายคอลัมน์ภายในตาราง
- ชุดหมายเลขการปั่นจักรยาน - แอปพลิเคชันต้องรีสตาร์ทชุดหมายเลขเมื่อถึงหมายเลขที่ระบุ ตัวอย่างเช่น หลังจากกําหนดค่า 1 ถึง 10 แล้ว แอปพลิเคชันจะเริ่มกําหนดค่า 1 ถึง 10 อีกครั้ง
-
ค่าลําดับที่เรียงลําดับ - แอปพลิเคชันต้องการค่าลําดับเพื่อเรียงลําดับตามฟิลด์อื่น ฟังก์ชันสามารถใช้
NEXT VALUE FOROVERส่วนคําสั่ง ซึ่งรับประกันว่าค่าที่ส่งคืนจะถูกสร้างขึ้นตามลําดับของORDER BYส่วนคําสั่ง -
จองหลายหมายเลข - แอปพลิเคชันจําเป็นต้องจองหมายเลขลําดับหลายหมายเลขพร้อมกัน การร้องขอค่าข้อมูลประจําตัวอาจส่งผลให้เกิดช่องว่างหากกระบวนการอื่นออกหมายเลขพร้อมกัน การโทร
sp_sequence_get_rangeจะดึงตัวเลขหลายหมายเลขในลําดับพร้อมกัน - ข้อมูลจําเพาะที่เปลี่ยนแปลงได้ - คุณต้องเปลี่ยนข้อมูลจําเพาะของลําดับ เช่น ค่าที่เพิ่มขึ้น หลังจากสร้าง
ออบเจ็กต์ลําดับสามารถให้ความยืดหยุ่นมากกว่าคอลัมน์ข้อมูลประจําตัว:
| คุณสมบัติ | Sequence | Identity |
|---|---|---|
| ผูกติดกับโต๊ะ | ไม่ | ใช่ |
| ใช้ร่วมกันระหว่างตารางหรือคอลัมน์ | ใช่ | ไม่ |
| รับค่าถัดไปก่อนดําเนินการแทรก | ใช่ | ไม่ |
| ค่าต่ําสุด/สูงสุดที่กําหนดเอง | ใช่ | จำกัด |
| ดึงตัวเลขหลายตัวพร้อมกัน | ใช่ | ไม่ |
| รอบ/รีสตาร์ทตามจํานวนที่กําหนด | ใช่ | ไม่ |
| เรียงลําดับค่าตามเขตข้อมูลอื่น | ใช่ | ไม่ |
| เปลี่ยนการเพิ่มหลังจากสร้าง | ใช่ | ไม่ |
ใช้คอลัมน์ข้อมูลประจําตัวเมื่อคุณต้องการคีย์หลักที่เพิ่มขึ้นอัตโนมัติอย่างง่ายสําหรับตารางเดียว และไม่จําเป็นต้องใช้ชุดตัวเลขเดียวกันร่วมกันในหลายตาราง หรือดึงค่าถัดไปก่อนที่จะแทรกแถว
ใช้ลําดับเมื่อแอปพลิเคชันของคุณต้องการหมายเลขก่อนที่จะทําการแทรกจําเป็นต้องใช้ชุดข้อมูลเดียวระหว่างหลายตารางต้องรีสตาร์ทชุดตัวเลขเมื่อถึงหมายเลขที่ระบุหรือจําเป็นต้องจองหมายเลขลําดับหลายหมายเลขพร้อมกัน
ทําความเข้าใจข้อจํากัดของลําดับ
ค่าลําดับจะไม่ได้รับการป้องกันโดยอัตโนมัติหลังจากแทรกลงในตาราง ซึ่งแตกต่างจากคอลัมน์ข้อมูลประจําตัว นอกจากนี้ ระบบจะไม่บังคับใช้ค่าลําดับโดยอัตโนมัติ ถ้าค่าลําดับในตารางต้องไม่ซ้ํากัน ให้สร้างข้อจํากัดที่ไม่ซ้ํากันบนคอลัมน์
หมายเลขลําดับถูกสร้างขึ้นนอกขอบเขตของธุรกรรมปัจจุบัน มีการใช้ธุรกรรมที่ใช้หมายเลขลําดับ ถูกผูกมัดหรือย้อนกลับ
คุณสามารถสร้างออบเจ็กต์ลําดับได้โดยใช้ CREATE SEQUENCE คําสั่งที่มีพารามิเตอร์เพิ่มเติมสําหรับการเริ่มต้น การเพิ่ม และช่วง ตัวอย่างมีดังนี้:
-- Create sequence
CREATE SEQUENCE OrderNumber
START WITH 1000
INCREMENT BY 1
MINVALUE 1000
MAXVALUE 999999
NO CYCLE;
-- Use sequence in INSERT with NEXT VALUE FOR function
INSERT INTO Order (OrderID, CustomerID, OrderNumber, OrderDate)
VALUES (1, 100, NEXT VALUE FOR OrderNumber, GETDATE());
-- Get next value before INSERT
DECLARE @NextOrderNum INT = NEXT VALUE FOR OrderNumber;
SELECT @NextOrderNum;
-- Get multiple sequence numbers at once for batch processing
DECLARE @FirstSeq INT, @LastSeq INT;
EXEC sp_sequence_get_range
@sequence_name = N'OrderNumber',
@range_size = 100,
@range_first_value = @FirstSeq OUTPUT,
@range_last_value = @LastSeq OUTPUT;
-- Reset sequence
ALTER SEQUENCE OrderNumber RESTART WITH 1000;
ตัวอย่างนี้สร้างลําดับที่มีชื่อ OrderNumber ที่เริ่มต้นที่ 1000 เพิ่มขึ้นทีละ 1 และหยุดที่ 999999 โดยไม่ต้องวนกลับ ฟังก์ชันจะ NEXT VALUE FOR ดึงหมายเลขถัดไปที่พร้อมใช้งาน ไม่ว่าจะเป็นแบบอินไลน์ระหว่าง INSERT คําสั่งหรือกําหนดให้กับตัวแปรก่อนการแทรกเมื่อแอปพลิเคชันจําเป็นต้องอ้างอิงค่าก่อน สําหรับการดําเนินการแบทช์ที่ต้องใช้หมายเลขลําดับหลายหมายเลขพร้อมกัน ให้ sp_sequence_get_range สงวนบล็อก 100 ตัวเลข โดยส่งกลับค่าแรกและค่าสุดท้ายในช่วง
ALTER SEQUENCEคําสั่งจะรีเซ็ตลําดับกลับเป็น 1000 เมื่อจําเป็น
ข้อจํากัดคือการตัดสินใจทางสถาปัตยกรรมที่ป้องกันปัญหาก่อนที่จะเกิดขึ้น ข้อจํากัดที่ CHECK ขาดหายไปทําให้ข้อมูลที่ไม่ถูกต้องทําให้ฐานข้อมูลของคุณเสียหายอย่างเงียบๆ การเลือกคอลัมน์ข้อมูลประจําตัวเมื่อคุณต้องการการกําหนดหมายเลขแบบไขว้ตารางจะบังคับให้มีวิธีแก้ปัญหาระดับแอปพลิเคชัน ข้อจํากัดที่กําหนดไว้ที่ระดับฐานข้อมูลจะปกป้องคุณภาพของข้อมูลไม่ว่าแอปพลิเคชัน เครื่องมือ หรือสคริปต์ใดจะเข้าถึงฐานข้อมูลของคุณ การตัดสินใจเหล่านี้กําหนดการรับประกันความสมบูรณ์ของข้อมูลของคุณตลอดอายุการใช้งานของแอปพลิเคชันของคุณ