ความถูกต้องสมบูรณ์ของข้อมูล (ใช้ NOT NULL, UNIQUE, Foreign Key, Check)

SQL Knowledge ทั้ง sql มาตรฐาน หลักการออกแบบฐานข้อมูล ความสัมพันธ์ของ ตาราง Mysql , PGSQL, Oracle, MSSQL

Moderator: mindphp, ผู้ดูแลกระดาน

M013
PHP Super Hero Member
PHP Super Hero Member
โพสต์: 829
ลงทะเบียนเมื่อ: 22/04/2010 12:02 pm

ความถูกต้องสมบูรณ์ของข้อมูล (ใช้ NOT NULL, UNIQUE, Foreign Key, Check)

โพสต์ที่ยังไม่ได้อ่าน โดย M013 »

ความถูกต้องสมบูรณ์ของข้อมูล(ใช้ NOT NULL, UNIQUE, Foreign Key, Check)
การสร้างฐานข้อมูลที่ดีนั้น ข้อมูลจะต้องมีความถูกต้องเพื่อให้เกิดความน่าเชื่อถือ เช่น ฐานข้อมูลนักศึกษาจะต้องมีไม่ซ้ำกัน เเต่หากในกรณีที่ชื่อนักศึกษาซ้ำกัน เราก็สามารถเเยกตัวนักศึกออกได้ โดยการที่ Primary Key ไม่ซ้ำกัน เป็นต้น

สามารถทำให้ข้อมูลถูกต้องสมบูรณ์ได้โดยการใช้ NOT NULL, UNIQUE, Foreign Key, Check
ข้อมูลที่ถูกต้องสมบูรณ์จะต้องเป็นไปตามกฎที่ใช้จัดเก็บข้อมูลเชิงสัมพันธ์ 2 กฎดังนี้
1. ความถูกต้องสมบูรณ์ของเอนทิตี้ (Entity integrity rule)
  1. " ทุกเอนทิตี้ต้องมี Primary Key เเละ Primary Key จะต้องมีค่าไม่ซ้ำ "
  1. ดังนั้น ทุกครั้งที่สร้าง Primary Key ให้เป็นไปตามกฎข้อที่ 1
    • - ต้องกำหนดให้ไม่เป็นค่าว่างโดยใช้ "NOT NULL" เเละ
    • - กำหนดให้ไม่เป็นค่าซ้ำโดยใช้ "UNIQUE"
  • ตัวอย่างเช่น

    โค้ด: เลือกทั้งหมด

    CREATE TABLE student
       (stu_id  char(4)  NOT NULL UNIQUE,
        stu_fname  char(40)  NOT NULL,
        stu_lname  char(40)  NOT NULL,
        stu_address  char(255)  NOT NULL,
        stu_phone  char(10),
        stu_email  char(40),
        PRIMARY KEY  (stu_id));
    จากตัวอย่าง code ด้านบน Primary Key ของตารางนี้คือ "stu_id" กำหนดเอาไว้ว่า NOT NULL เเละ UNIQUE หมายความว่า
    • 1) ในฐานข้อมูลมีรหัสนักศึกษา "S001" เเละ นักศึกษาชื่อ "พิชัย" เเล้วต้องการเพิ่มรหัสนักศึกษา "S001" ชื่อ "นันทกร" ?
      • คำตอบ ไม่ได้เพราะ Primary เป็น UNIQUE คือ ห้ามซ้ำ
      2) เมื่อเพิ่มค่าซ้ำไม่ได้ เเล้วหากเพิ่มโดยไม่ระบุรหัสนักศึกษาเพื่อที่จะได้ไม่ซ้ำ ?
      • คำตอบ ไม่ได้เพราะ Primary เป็น NOT NULL คือ ห้ามว่าง
      3) ต้องการเพิ่มนักศึกอีก 1 คน โดยให้รหัสนักศึกษา "S002" เเล้วชื่อ "พิชัย" ?
      • คำตอบ ได้เพราะ Primary ไม่เป็นค่าซ้ำ เเละ ค่าว่าง
2. ความถูกต้องสมบูรณ์ของการอ้างอิงข้อมูล (Referential integrity rule)
  1. " Foreign Key (คีย์นอก) จะต้องมีค่าข้อมูลตรงกับ Primary Key ของอีกตารางหนึ่งที่มีความสัมพันธ์ด้วย "
  1. ดังนั้น เมื่อมีการกำหนด Foreign Key ทุกครั้งให้เป็นไปตามกฎข้อที่ 2
    • - ต้องกำหนดโดยใช้ "FOREIGN KEY (<ชื่อคอลัมน์ของตารางหลัก>) REFERENCES <ชื่อตารางที่มีความสัมพันธ์ด้วย>"
  • ตัวอย่างเช่น

    โค้ด: เลือกทั้งหมด

     CREATE TABLE student
       (stu_id  char(4)  NOT NULL UNIQUE,
        stu_fname  char(40)  NOT NULL,
        stu_lname  char(40)  NOT NULL,
        stu_address  char(255)  NOT NULL,
        stu_phone  char(10),
        stu_email  char(40),
        PRIMARY KEY  (stu_id),
        FOREIGN KEY (subj_id) REFERENCES subject);
    จากตัวอย่าง code ข้างต้น ตาราง student จะมี Foreign Key คือ "subj_id" ซึ่งมีค่าตรงกับ Primary Key ของตาราง subject
นอกจากนั้นเรายังสามารถใช้ CHECK ในการทำให้ข้อมูลถูกต้องสมบูรณ์
CHECK คือ การตรวจสอบข้อมูลก่อนบันทึกลงฐานข้อมูล
  • ตัวอย่างเช่น

    โค้ด: เลือกทั้งหมด

     CREATE TABLE student
       (stu_id  char(4)  NOT NULL UNIQUE,
        stu_fname  char(40)  NOT NULL,
        stu_lname  char(40)  NOT NULL,
        stu_address  char(255)  NOT NULL,
        stu_age  int NOT NULL,
        stu_phone  char(10),
        stu_email  char(40),
        PRIMARY KEY  (stu_id),
        FOREIGN KEY (subj_id) REFERENCES subject,
        CONSTRAINT chk_age CHECK (stu_age >= 18));
    จากตัวอย่าง code ข้างต้น ตาราง student จะมีการตรวจสอบข้อมูลอายุของนักศึกษาที่ต้องระบุเอาไว้โดยมากกว่าหรือเท่ากับ 18
    • 1) หากต้องการระบุของอายุนักศึกษา "17" ?
      • คำตอบ ไม่ได้เพราะ 17 มีค่าน้อยกว่า 18
    • 1) หากต้องการระบุของอายุนักศึกษา "20" ?
      • คำตอบ ได้เพราะ 20 มีค่ามากกว่า 18
สรุป
  • ฐานข้อมูลที่ดี คือ การทำให้ข้อมูลมีความถูกต้องสมบูรณ์โดยเป็นไปตามกฎข้างต้น 2 ข้อซึ่งสามารถใช้ NOT NULL, UNIQUE เข้ามาช่วยในการสร้าง Primary ส่วนเรื่องของ Foreign Key ก็จะต้องมีค่าตรงกับ Primary Key ของตารางหลัก เเละ นอกจากนั้นยังสามารถใช้ CHECK ในการตรวจสอบค่าก่อนที่จะทำการบันทึกลงฐานข้อมูล
  • Similar Topics
    ตอบกลับ
    แสดง
    โพสต์ล่าสุด

ผู้ใช้งานขณะนี้

สมาชิกกำลังดูบอร์ดนี้: Google Adsense [Bot] และบุคลทั่วไป 10