บังคับใช้ความสมบูรณ์ของข้อมูลด้วยข้อจํากัด

เสร็จสมบูรณ์เมื่อ

ข้อจํากัดและวัตถุลําดับเป็นตัวเลือกการออกแบบที่ป้องกันปัญหาข้อมูลก่อนที่จะเกิดขึ้น ข้อจํากัดของคีย์นอกที่ขาดหายไปหมายความว่าระเบียนที่ไม่ได้ใช้งานอาจมีอยู่ในฐานข้อมูลของคุณอยู่แล้ว การเพิ่มออบเจ็กต์ลําดับในภายหลังเพื่อแทนที่คอลัมน์ข้อมูลประจําตัวจําเป็นต้องมีการเปลี่ยนแปลงในแอปพลิเคชันทั้งหมด โค้ดแอปพลิเคชันสามารถตรวจสอบความถูกต้องของข้อมูลได้ แต่ผู้ใช้สามารถข้ามข้อมูลผ่านการนําเข้าจํานวนมาก การสืบค้นโดยตรง หรือแอปพลิเคชันใหม่ที่ข้ามการตรวจสอบความถูกต้อง

ข้อจํากัดของฐานข้อมูลบังคับใช้กฎในระดับกลไกจัดการ ดังนั้นจึงมีผลบังคับใช้เสมอ การตัดสินใจที่คุณทําในระหว่างการออกแบบ เช่น กฎที่จะบังคับใช้ในฐานข้อมูล และจะใช้คอลัมน์หรือลําดับข้อมูลประจําตัว จะส่งผลต่อคุณภาพข้อมูลของคุณตลอดอายุการใช้งานของแอปพลิเคชันของคุณ

ทําความเข้าใจว่าเมื่อใดควรใช้ข้อจํากัด

ปัญหาคุณภาพข้อมูลมีราคาแพง คุณภาพของข้อมูลที่ไม่ดีนําไปสู่การตัดสินใจทางธุรกิจที่ไม่ถูกต้องการผสานรวมที่ล้มเหลวและการละเมิดการปฏิบัติตามข้อกําหนด ซึ่งแตกต่างจากการตรวจสอบระดับแอปพลิเคชันที่อาจไม่สอดคล้องกันในแอปพลิเคชันต่างๆ ที่เข้าถึงฐานข้อมูลเดียวกัน ข้อจํากัดจะบังคับใช้กฎในระดับกลไกฐานข้อมูล ซึ่งไม่สามารถข้ามได้ด้วยโค้ดแอปพลิเคชัน การสืบค้นเฉพาะกิจ สคริปต์ 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 ขาดหายไปทําให้ข้อมูลที่ไม่ถูกต้องทําให้ฐานข้อมูลของคุณเสียหายอย่างเงียบๆ การเลือกคอลัมน์ข้อมูลประจําตัวเมื่อคุณต้องการการกําหนดหมายเลขแบบไขว้ตารางจะบังคับให้มีวิธีแก้ปัญหาระดับแอปพลิเคชัน ข้อจํากัดที่กําหนดไว้ที่ระดับฐานข้อมูลจะปกป้องคุณภาพของข้อมูลไม่ว่าแอปพลิเคชัน เครื่องมือ หรือสคริปต์ใดจะเข้าถึงฐานข้อมูลของคุณ การตัดสินใจเหล่านี้กําหนดการรับประกันความสมบูรณ์ของข้อมูลของคุณตลอดอายุการใช้งานของแอปพลิเคชันของคุณ