Contents

5 ข้อจำกัด SQL เพื่อรับประกันโครงสร้างฐานข้อมูลที่ดี

ประเด็นที่สำคัญ

การใช้ข้อจำกัดของ SQL มีความสำคัญอย่างยิ่งต่อการรักษาความสมบูรณ์ของฐานข้อมูล ขณะเดียวกันก็รับประกันความสอดคล้องของเนื้อหาทั้งหมดด้วย ข้อจำกัดดังกล่าวประการหนึ่งคือข้อจำกัด NOT NULL ซึ่งกำหนดว่าคอลัมน์ไม่สามารถยอมรับค่า Null ได้ จึงบังคับใช้ความสำคัญของการให้ข้อมูลที่ถูกต้องภายในฟิลด์เหล่านี้

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

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

ฐานข้อมูลที่มีการจัดระเบียบอย่างดีมีความสำคัญอย่างยิ่งต่อฟังก์ชันต่างๆ มากมาย แต่เมื่อไม่มีโปรโตคอลที่กำหนดไว้สำหรับการจัดเก็บและจัดการข้อมูล ความสับสนวุ่นวายก็อาจตามมา

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

มีข้อจำกัด SQL หลายประเภท ซึ่งมีประโยชน์อย่างมากในการรับรองความสมบูรณ์ของข้อมูลและความปลอดภัยภายในฐานข้อมูล

ไม่ใช่ข้อจำกัดที่เป็นโมฆะ

ตามค่าเริ่มต้น คอลัมน์ฐานข้อมูลจะอนุญาตให้จัดเก็บค่า Null ได้ Null แสดงถึงการไม่มีค่าใดๆ ทั้งสิ้น ในทางกลับกัน ข้อจำกัดที่ไม่ใช่ค่าว่างจะกำหนดว่าคอลัมน์ใดคอลัมน์หนึ่งต้องยกเว้นค่าว่าง และต้องใช้ค่าที่สำคัญแทน

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

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

 CREATE TABLE Customers (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255) NOT NULL,
    Mobile_No int NOT NULL,
    Age int
);

หากมีผู้พยายามแทรกบันทึกลูกค้าที่ไม่มีฟิลด์อายุ ฐานข้อมูลจะรับทราบความพยายามดังกล่าวโดยไม่มีการสร้างข้อความแสดงข้อผิดพลาด:

 INSERT INTO Customers (ID, LastName, FirstName, Mobile_No)
VALUES (123456, 'Dior', 'Christian', 0723000000); 

แม้ว่าจะพยายามแทรกบันทึกโดยไม่รวมฟิลด์"FirstName"ไว้ ระบบฐานข้อมูลจะสร้างข้อความแสดงข้อผิดพลาดในการตอบสนอง:

 ERROR: null value in column "firstname" violates not-null constraint
Detail: Failing row contains (123456, Dior, null, 723000000, null). 

ข้อ จำกัด ของคีย์หลัก

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

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

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

เพื่อที่จะใช้ข้อจำกัดคีย์หลักภายในฐานข้อมูล MySQL เราอาจอ้างอิงถึงโค้ดตัวอย่างต่อไปนี้:

 CREATE TABLE Customers (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int,
   PRIMARY KEY (ID)
); 

ฐานข้อมูลจะปฏิเสธความพยายามของผู้ใช้ในการส่งข้อมูลที่มีตัวระบุที่ซ้ำกัน ในกรณีที่เหตุการณ์ดังกล่าวเกิดขึ้น จะมีการยกข้อยกเว้นขึ้นเพื่อแสดงว่ามีข้อมูลที่ซ้ำกัน ในสถานการณ์ที่กำหนดให้ แต่ละคนพยายามเพิ่มสองรายการด้วยหมายเลขประจำตัวที่เหมือนกัน:

 INSERT INTO Customers (ID, LastName, FirstName, Age)
VALUES (1, 'John', 'Doe', 35 );

 INSERT INTO Customers (ID, LastName, FirstName, Age)
VALUES (1, 'Mary', 'Jane', 35 ); 

ฐานข้อมูลจะแสดงข้อความแสดงข้อผิดพลาด:

 Duplicate entry '1' for key 'PRIMARY' 

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

ข้อ จำกัด ที่สำคัญต่างประเทศ

คีย์นอกทำหน้าที่เป็นวิธีในการสร้างการเชื่อมโยงระหว่างสองตารางโดยการอ้างอิงคีย์หลักของตารางหนึ่งภายในตารางรองหรือตารางที่เกี่ยวข้อง สิ่งนี้ทำให้เกิดการเชื่อมต่อและการพึ่งพาซึ่งกันและกันระหว่างข้อมูลที่มีอยู่ภายในเอนทิตีที่แยกจากกันเหล่านี้ อำนวยความสะดวกในการสร้างลิงก์และการเชื่อมต่อผ่านสิ่งที่เหมือนกันที่ใช้ร่วมกัน

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

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

ซึ่งแตกต่างจากคีย์หลักซึ่งเป็นเอกลักษณ์เฉพาะภายในตาราง คีย์ภายนอกอาจมีอยู่ในหลายอินสแตนซ์ภายในตารางเดียวและสามารถมีค่า Null ได้ ตัวอย่างเช่น ในภาพประกอบที่ให้ไว้ การสร้างคำสั่งซื้อจำเป็นต้องใช้มูลค่าของคีย์ต่างประเทศของลูกค้า\_id

 CREATE TABLE Customers (
    customer_id INT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50)
);

CREATE TABLE Orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    order_date DATE,
    FOREIGN KEY (customer_id) REFERENCES Customers(customer_id)
);

INSERT INTO Customers(customer_id, first_name, last_name)
VALUES (1, 'Christian', 'Dior');

INSERT INTO Orders(order_id, customer_id, order_date)
VALUES (1, 1, '2023-08-07'); 

เมื่อพยายามสร้างธุรกรรมโดยไม่มีตัวระบุที่มีอยู่แล้วสำหรับลูกค้า ระบบจะแสดงการแจ้งเตือนข้อผิดพลาด

 Cannot add or update a child row: a foreign key constraint fails
(`db_9_4ee205c`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY
(`customer_id`) REFERENCES `customers` (`customer_id`)) 

ข้อจำกัดที่ไม่ซ้ำใคร

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

เราสามารถใช้ข้อจำกัด UNIQUE หลายรายการภายในตารางเดียวซึ่งตรงกันข้ามกับคีย์หลักเอกพจน์ ดังที่แสดงโดยการสร้างตาราง “ลูกค้า” ที่มีตัวระบุและหมายเลขโทรศัพท์ที่แตกต่างกัน การดำเนินการตามข้อจำกัดดังกล่าวจะดำเนินการผ่านการใช้ไวยากรณ์ที่ตามมาภายในระบบการจัดการฐานข้อมูล MySQL:

 CREATE TABLE Customers (
    ID int NOT NULL UNIQUE,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Mobile_No BIGINT UNIQUE
 ); 

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

 INSERT INTO Customers (ID, LastName, FirstName, Mobile_No)
VALUES (123456, 'Dior', 'Christian', 254000000 );

INSERT INTO Customers (ID, LastName, FirstName, Mobile_No)
VALUES (7891011, 'Dedan', 'Kimathi', 254000000 ); 

การแจ้งเตือนหรือการแจ้งเตือนที่สร้างขึ้นเพื่อตอบสนองต่อความพยายามเข้าสู่ระบบที่ไม่สำเร็จ ซึ่งรวมถึงข้อมูลเกี่ยวกับบัญชีผู้ใช้และสิทธิพิเศษที่เกี่ยวข้อง โดยทั่วไปจะเป็นไปตามรูปแบบมาตรฐานที่ประกอบด้วยรายละเอียดเฉพาะ เช่น วันที่และเวลาที่ความพยายามในการรับรองความถูกต้องล้มเหลว ชื่อผู้ใช้ หรือชื่อบัญชีที่เกี่ยวข้องกับความพยายาม คำอธิบายโดยย่อเกี่ยวกับลักษณะของความล้มเหลว (เช่น ระบุรหัสผ่านไม่ถูกต้อง) และคำแนะนำที่เกี่ยวข้องในการแก้ไขปัญหา

 Duplicate entry '254000000' for key 'Mobile_No' 

ข้อจำกัด UNIQUE ซึ่งเป็นข้อจำกัดฐานข้อมูลประเภทเฉพาะ รับประกันว่าไม่มีสองระเบียนในฐานข้อมูลที่มีค่าที่เหมือนกันสำหรับฟิลด์รหัสลูกค้าหรือหมายเลขโทรศัพท์มือถือ

ตรวจสอบข้อจำกัด

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

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

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

 CREATE TABLE Customers (
    ID int NOT NULL,
    Age int CHECK(Age>=18),
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Mobile_No BIGINT UNIQUE
 ); 

หากมีผู้พยายามป้อนอายุของลูกค้าที่ต่ำกว่าเกณฑ์ 18 ปี

 INSERT INTO Customers (ID, Age, LastName, FirstName, Mobile_No)
VALUES (123456, 15, 'Dior', 'Christian', 1254000000 ); 

ฐานข้อมูลอาจแสดงการแจ้งเตือนที่ระบุว่ามีปัญหาซึ่งอาจมีลักษณะคล้ายกับรูปแบบต่อไปนี้:

 ERROR: new row for relation "customers" violates check constraint
"customers_age_check"
Detail: Failing row contains (123456, 15, Dior, Christian, 1254000000) 

วิธีเพิ่มและลบข้อจำกัด SQL จากฐานข้อมูล

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

นอกเหนือจากข้อจำกัด SQL ที่กล่าวถึงในที่นี้ ยังมีข้อจำกัดมากมายที่อาจสำรวจเพื่อสร้างฐานข้อมูลแบบกำหนดเอง การเริ่มต้นด้วยสิ่งที่อธิบายไว้ในงานชิ้นนี้จะเป็นจุดเริ่มต้นที่เหมาะสม