วันจันทร์ที่ 1 กุมภาพันธ์ พ.ศ. 2559

CONSTRAINT MySQL : ข้อจำกัด

CONSTRAINT MySQL 


     คือ ข้อจำกัดที่ถูกใช้ในการระบุกฏและข้อบังคับของข้อมูลในตาราง ที่จะถูกจัดเก็บในลำดับต่อไป
โดยมี constraint ที่รองรับ ดังนี้

1) NOT NULL
2) ๊CHECK*
3) DEFAULT
4) UNIQUE
5) PRIMARY KEY
6) FOREIGN KEY (Referential Integrity constraint)



Detail for each constraint 

  • NOT NULL
          ใช้สำหรับ กำหนดให้การใส่ข้อมูลในcolumn นั้นๆจะไม่ยอมรับค่าที่เป็น null ได้
          Syntax :
                    CREATE TABLE table_name ( column_name column_type NOT NULL);
          
          Example :
                    เช่น ใช้ในกรณีของการใช้เก็บข้อมูล ชื่อ และนามสกุลของลูกค้า โดยกำหนดว่า ห้ามเป็น null หรือค่าว่าง แต่สำหรับอายุ จะไม่ใส่ก็ได้ 

ภาพแสดงตัวอย่างตารางข้อมูลที่ได้ออกแบบไว้


                              
ภาพแสดงคำสั่งที่ใช้ในการสร้างตาราง



                    พอใช้คำสั่ง describe customer; เพื่อดูรายละเอียดของตาราง จะเห็นได้ว่า  รายละเอียดของตารางของattribute name กับ surname ไม่ยอมรับการใส่null คือ ตรงคอลัมน์ null มีค่าเป็น no




ภาพแสดงรายละเอียดของตาราง

                    ตัวอย่างการใส่ข้อมูล โดยมีอยู่ 3 กรณี ที่เราจะไม่สามารถใส่ข้อมูล
                        1) ใส่แต่อายุ
                        2) ใส่ชื่อกับอายุ
                        3) ใส่นามสกุลกับอายุ

ตัวอย่างการใส่ข้อมูลแต่อายุ

ตัวอย่างการใส่ข้อมูลแต่ชื่อและอายุ

ตัวอย่างการใส่ข้อมูลแต่นามสกุลและอายุ

                    แต่เราสามารถใส่ข้อมูลชื่อกับนามสกุล โดยไม่ใส่อายุได้ เนื่องจากข้อมูลอายุเราไม่ได้กำหนดว่า ห้ามเป็น null

ภาพแสดงตัวอย่างการใส่ข้อมูลชื่อกับนามสกุล โดยไม่ใส่อายุ

ภาพแสดงตัวอย่างการใส่ข้อมูลครบถ้วน

                    จากนั้นทำการเช็คข้อมูลที่ได้เพิ่มเข้าไป โดยใช้คำสั่ง select * from customer;  จะเห็นได้ว่าข้อมูลแถวแรก ตรงคอลัมน์ age เป็นค่า null เนื่องจากไม่มีการใส่ค่าจากผู้ใช้

ภาพแสดงตารางข้อมูล
             
  • CHECK*
          สาเหตุที่ทำการใส่ดอกจันทร์สีแดง เนื่องจาก ทางเว็บไซต์ w3schools ได้มีตัวอย่างการใช้ constraint check แต่พอทำตามแล้ว กลับไม่เป็นไปอย่างที่คิดไว้ จึงได้ทำการศึกษาข้อมูลเพิ่มเติม จึงได้คำตอบว่า "check constraints are not supported in MySQL" นั่นก็คือ MySQL ไม่รองรับ constraint check อ้างอิงข้อมูลจาก http://oak.cs.ucla.edu/cs143/project/mysql/constraints.html
          ตัวอย่างที่ทำ คือ สร้างตารางชื่อ persons เก็บข้อมูลชื่อกับอายุ โดยอายุที่ใส่ กำหนดให้มากกว่า 18 
ภาพแสดงการสร้างตาราง โดยใช้constraint check

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

          จากนั้นลองทำการเช็คข้อมูลในตาราง พบว่าข้อมูลถูกจัดเก็บจริง ซึ่งในความเป็นจริง ไม่ควรถูกจัดเก็บในตาราง
ภาพแสดงข้อมูลในตาราง

โดยข้อมูลการศึกษาตัวอย่าง อ้างอิงจาก http://www.w3schools.com/sql/sql_check.asp
ภาพตัวอย่างการใช้constraint check จากเว็บไซต์

  • DEFAULT
          เป็นการกำหนด default ให้กับค่าที่ใส่ในตาราง ในกรณีที่ไม่ได้ใส่ข้อมูล
          Syntax :
               CREATE TABLE table_name
(column_name column_type DEFAULT 'default_value' );

          Example :
               เช่น ใส่ข้อมูลเกี่ยวกับเด็ก โดยในตารางมีการใส่ชื่อกับเพศ โดยเพศของเด็กในกรณีที่ไม่ใส่ จะถือว่ามีค่าเป็นเด็กผู้ชาย หรือ male นั่นเอง
ตัวอย่างตารางที่ได้ทำการออกแบบไว้

ภาพแสดงตัวอย่างคำสั่งการสร้างตารางโดยใช้ default

               ดูรายละเอียดของตารางโดยใช้คำสั่ง describe children; จะเห็นได้ว่าตรงค่า default ของ gender มีค่าเป็น male
ภาพแสดงรายละเอียดของตาราง
               ทดลองใส่ข้อมูล โดยการใส่ข้อมูลเป็นไปตามตารางด้านบนที่ได้ออกแบบไว้ โดยข้อมูลตัวที่สองจะไม่ใส่ค่า gender เพื่อดูการทำงานของ default
เพิ่มข้อมูลชุดแรก โดยให้เพศเป็นผู้หญิง
 
 เพิ่มข้อมูลชุดแรก โดยไม่ใส่เพศ 

เพิ่มข้อมูลชุดที่สาม โดยให้เพศเป็นผู้ชาย ซึ่งเหมือนกับค่า default

ภาพแสดงตารางข้อมูล โดยเป็นไปตามตารางที่ออกแบบไว้

  • UNIQUE
          ใช้ในกำหนดว่าการใส่ค่าข้อมูลในคอลัมน์นั้นจะไม่ยอมรับ ค่าข้อมูลที่มีค่าซ้ำกัน ซึ่งจะแตกต่างจากconstraint ที่เป็น PRIMARY KEY (จะได้ศึกษาในลำดับถัดไป) ตรงที่ UNIQUE นั้นจะไม่มีส่วนเกี่ยวข้องใดๆกับ FOREIGN KEY และคอลัมน์ที่มี constraint เป็น unique จะสามารถมีค่าข้อมูลเป็น NULL ได้ โดยค่าข้อมูลที่เป็น NULL นั้นมีความหมายที่ไม่ซ้ำกัน
          Syntax :
               CREATE TABLE table_name                     (column_name column_type UNIQUE);

          Example :
               เช่น การเก็บข้อมูล username กับ ชื่อและนามสกุล โดยมีแนวคิดที่ว่า 1 คนสามารถมีได้หลาย username แต่ username จะไม่มีทางซ้ำกัน  จึงกำหนดให้ attribute username มีconstraint เป็น unique 
ภาพแสดงตัวอย่างตารางที่ได้ออกแบบไว้


ภาพตัวอย่างการสร้างตารางโดยกำหนด constraint unique
               ทดลองการใส่ข้อมูล โดยใส่ข้อมูลตามตารางที่ได้ออกแบบไว้ โดยสามข้อมูลแรกที่ใส่ สามารถใส่ได้ปกติ แต่เมื่อถึงการใส่ข้อมูลตัวที่ 4 จะมีการแจ้งเตือน เนื่องจากข้อมูลตัวที่ 4 ที่ตำแหน่งของ username มีค่าที่ซ้ำกับค่าที่ใส่ไปก่อนหน้านี้ ซึ่งค่าusername ไม่สามารถซ้ำกันได้ เนื่องจากถูกตั้งให้เป็น unique


ภาพแสดงการใส่ข้อมูลตัวที่ 1-3 ตามลำดับ

ภาพแสดงการเกิด error เมื่อใส่ข้อมูลตัวที่ 4 ที่มีค่า username ซ้ำ

               เมื่อดูที่ตารางข้อมูล จะเห็นได้ว่า ในตารางจะไม่มีข้อมูลตัวที่ 4 อยู่เลย


ภาพแสดงตารางข้อมูล

PRIMARY KEY & FOREIGN KEY

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

  • PRIMARY KEY
          ซึ่ง Primary key จะมีคุณสมบัติ UNIQUE (นั่นคือไม่สามารถใส่ข้อมูลซ้ำกับข้อมูลเดิมได้) และ NOT NULL (สาเหตุที่เป็น not null เพื่อใช้ในการค้นหา) และจะใช้งานร่วมกับ Foreign key
          Syntax :
               CREATE TABLE table_name                     (column_name column_type,
                      PRIMARY KEY ( column_name));

          Example :
               เช่น การสร้างตารางเก็บชื่อย่อของภาควิชา,ความหมายเต็ม และสถานที่ตั้ง โดย primary key ที่แสดงในรูปแบบตาราง จะถูกขีดเส้นใต้ เพื่อบ่งบอก constraint ของมัน 
 ภาพแสดงตารางที่ได้ออกแบบไว้ โดยใช้ primary key

               ซึ่งในตารางที่ได้ออกไว้ primary key คือ n_department 

ภาพแสดงตัวอย่างการสร้างตาราง

               ทำการใส่ข้อมูลตามที่ได้ออกแบบในตอนต้นทั้งสองข้อมูล แต่เมื่อทำการใส่ข้อมูลที่สาม ที่กำหนดให้ชื่อภาควิชาซ้ำกับของเดิมที่มีอยู่คือ ใส่ IE ซึ่งซ้ำกับข้อมูลตัวที่ 2 จึงมีการแจ้งเตือนerror ดังนี้


ภาพแสดงการใส่ข้อมูลตัวที่ 1 และ 2 ที่ไม่เกิดปัญหา


ภาพแสดงการใส่ข้อมูลตัวที่ 3 เพื่อทดลองการแจ้งเตือนเมื่อข้อมูลซ้ำ

ภาพแสดงตารางข้อมูล


  • FOREIGN KEY
          จะถูกใช้งานร่วมกันกับ primary key เพื่อสร้างความสัมพันธ์กันระหว่าง2 ตาราง เพื่อให้ละการใส่ข้อมูล
          Syntax :
               CREATE TABLE table_name                     (column_name column_type,
                      FOREIGN KEY ( column_name
                      REFERENCES table_pk_name ( column_pk_name )                              [ ON UPDATE RESTRICT | CASCADE | SET NULL ]                              [ ON DELETE RESTRICT | CASCADE | SET NULL ] );
               ** จะต้องสร้างตารางที่ใช้ในการอ้างอิงก่อน จึงจะใช้  FOREIGN KEY  ได้

          Example :
            เช่น การสร้างเก็บข้อมูลนักศึกษา โดยมีรหัสนักศึกษา ชื่อ นามสกุล และภาควิชาที่ศึกษาอยู่ โดยในข้อมูลของ attribute ภาควิชานี้ ได้อ้างอิงไปยังตารางของ department ที่ได้สร้างไว้ก่อนหน้าในบทเรียนของ primary key ซึ่งตารางข้อมูลที่ได้ออกแบบไว้คือ
ภาพแสดง ตารางที่ได้ออกแบบไว้

ภาพแสดงตัวอย่างการสร้างตาราง
                         ทำการใส่ข้อมูลตามตารางที่ได้ออกแบบไว้ในขั้นต้น ผลที่ได้คือเมื่อใส่ข้อมูลที่ 1-3 สามารถใส่ได้ปกติ ไม่เกิดปัญหาใดๆ (เนื่องจากค่าที่ใส่เข้าไปไม่มีค่า id ที่ซ้ำกัน และค่า department ตรงกับค่า n_department ในตาราง department ที่ได้สร้างไว้ก่อนหน้า) แต่เมื่อทำการใส่ข้อมูลชุดที่ 4 ที่กำหนดให้ department เป็นค่าที่ไม่เคยมีมาก่อนในตารางอ้างอิง จึงเกิด error ขึ้น

ภาพแสดงการใส่ข้อมูล 3 ชุดแรก

ภาพแสดง error ที่เกิดขึ้นเมื่อใส่ข้อมูลชุดที่ 4



ทำการเรียกดูข้อมูล โดยเชื่อมทั้งสองตารางจะใช้คำสั่งใดนะ???
          เรียนรู้เพิ่มเติมคือหากต้องการเชื่อมทั้งสองตาราง จะใช้คำสั่ง JOIN หรือ INNER JOIN  โดยทั้งสองตัวมีความหมายเหมือนกัน สามารถแสดงได้ในรูปเชิงคณิตศาสตร์ในคือการ intersection กัน คือ นำส่วนที่เหมือนกันทับซ้อนกัน 
ภาพแสดง รูปแบบ intersection
          Syntax :
ภาพแสดง syntax ของการใช้ inner join หรือ join
        

          Example :
            ในตารางทั้งสองตารางด้านบน เราสร้างตาราง s_engineer ที่ข้อมูลของ department อ้างอิงไปยัง ข้อมูล n_department ของตาราง department เราจึงทำการเชื่อมสองตารางเข้าด้วยกัน และให้แสดงข้อมูลออกมา 


ภาพแสดง การแสดงข้อมูลของทั้งสองตาราง

            ตารางที่กำหนดให้แสดงค่าออกมา กำหนดให้แสดงค่าของตาราง s_engineer ทั้งหมด และให้แสดงข้อมูลในตาราง department เฉพาะข้อมูล location ที่ชื่อdepartment ตรงกันจึงได้ข้อมูลออกมาดังตารางด้านบน


อ้างอิงเว็บไซต์ที่เกี่ยวข้อง

ไม่มีความคิดเห็น:

แสดงความคิดเห็น