ข้อจำกัดของ Oracle ส่วนใหญ่จะรักษาความสมบูรณ์ของข้อมูลในระดับตรรกะทางธุรกิจ ส่วนใหญ่โดยโปรแกรมเมอร์เพื่อระบุข้อจำกัดในแอปพลิเคชัน หรือโดยการกำหนดทริกเกอร์เพื่อรักษาความสมบูรณ์ของข้อมูล และสุดท้ายโดยการใช้ข้อจำกัดของ Oracle เองเพื่อรักษาความสมบูรณ์ของข้อมูล หากคุณสามารถใช้ข้อจำกัดของ Oracle เองเพื่อให้เป็นไปตามข้อกำหนดได้ ให้ลองใช้ข้อจำกัดของ Oracle เอง เนื่องจากการใช้ข้อจำกัดที่ผู้ใช้กำหนด เช่น ทริกเกอร์ จะส่งผลต่อประสิทธิภาพของฐานข้อมูล ตัวอย่างเช่น เมื่อใช้ทริกเกอร์ ตารางจะถูกล็อคและการสแกนตารางหรือการสแกนดัชนีจะดำเนินการ ซึ่งจะลดประสิทธิภาพของฐานข้อมูลและการทำงานพร้อมกัน
ข้อจำกัดของ Oracle แบ่งออกเป็นประเภทต่างๆ ดังต่อไปนี้:
ไม่ใช่ null ข้อจำกัดที่ไม่ใช่ null, ข้อจำกัดเฉพาะที่ไม่ซ้ำกัน, คีย์หลัก ข้อจำกัดของคีย์หลัก, ข้อจำกัดของคีย์ต่างประเทศของคีย์ภายนอก, ข้อจำกัดในการตรวจสอบ
ไม่ใช่ null ข้อจำกัดที่ไม่ใช่ null:
วิธีการสร้าง: 1. กำหนดที่ระดับคอลัมน์เมื่อสร้างตาราง (นั่นคือ คุณสามารถเขียนคำจำกัดความของข้อจำกัดหลังคอลัมน์เมื่อกำหนดตารางได้เท่านั้น) 2 วิธี รายการหนึ่งใช้ชื่อข้อจำกัดแบบกำหนดเอง และอีกรายการหนึ่งใช้ชื่อเริ่มต้นของระบบ
ดู plaincopy ไปที่ clipboardprint หรือไม่
สร้างตารางที
-
หมายเลข tid (8) ข้อ จำกัด NK_t1 ไม่ใช่โมฆะ
tname varchar2(10) ไม่ใช่ค่าว่าง
-
สร้างตารางที
-
หมายเลข tid (8) ข้อ จำกัด NK_t1 ไม่ใช่โมฆะ
tname varchar2(10) ไม่ใช่ค่าว่าง
-
ดู plaincopy ไปที่ clipboardprint หรือไม่
SQL> เลือก t.constraint_name, t.table_name, t.status, t.deferrable จาก user_constraints t;
CONSTRAINT_NAME TABLE_NAME สถานะสามารถเลื่อนออกไปได้
-------------------------------------------------- -------------------------------------------------- ----------------------
NK_T1 T เปิดใช้งานแล้วไม่สามารถเลื่อนออกไปได้
SYS_C003735 T เปิดใช้งานแล้วไม่สามารถเลื่อนออกไปได้
เอสแอลแอล>
SQL> เลือก t.constraint_name, t.table_name, t.status, t.deferrable จาก user_constraints t;
CONSTRAINT_NAME TABLE_NAME สถานะสามารถเลื่อนออกไปได้
-------------------------------------------------- -------------------------------------------------- ----------------------
NK_T1 T เปิดใช้งานแล้วไม่สามารถเลื่อนออกไปได้
SYS_C003735 T เปิดใช้งานแล้วไม่สามารถเลื่อนออกไปได้
เอสแอลแอล>
2. แก้ไขตารางหลังจากสร้างแล้ว แต่ตรวจสอบให้แน่ใจว่าข้อมูลในตารางไม่ละเมิดข้อจำกัด
ดู plaincopy ไปที่ clipboardprint หรือไม่
SQL> แก้ไขตาราง t แก้ไข tid ไม่ใช่ null;
ตารางมีการเปลี่ยนแปลง
SQL> เลือก t.constraint_name, t.table_name, t.status, t.deferrable จาก user_constraints t;
CONSTRAINT_NAME TABLE_NAME สถานะสามารถเลื่อนออกไปได้
-------------------------------------------------- -------------------------------------------------- ----------------------
SYS_C003736 T เปิดใช้งานแล้วไม่สามารถเลื่อนออกไปได้
เอสแอลแอล>
SQL> แก้ไขตาราง t แก้ไข tid ไม่ใช่ null;
ตารางมีการเปลี่ยนแปลง
SQL> เลือก t.constraint_name, t.table_name, t.status, t.deferrable จาก user_constraints t;
CONSTRAINT_NAME TABLE_NAME สถานะสามารถเลื่อนออกไปได้
-------------------------------------------------- -------------------------------------------------- ----------------------
SYS_C003736 T เปิดใช้งานแล้วไม่สามารถเลื่อนออกไปได้
เอสแอลแอล>
ตรวจสอบข้อจำกัด
วิธีการสร้าง: สามารถกำหนดได้ที่ระดับตารางและระดับคอลัมน์ (สามารถกำหนดได้หลังจากคอลัมน์หรือหลังจากกำหนดคอลัมน์แล้ว) นอกจากนี้ยังมีคำจำกัดความ 2 วิธี
ดู plaincopy ไปที่ clipboardprint หรือไม่
SQL> สร้างตาราง t
2 (
เลข 3 ตัว(8) ,
4 ชื่อ varchar2(10)
การตรวจสอบข้อ จำกัด 5 CK_T1 ((tid ไม่ใช่ null) และ (tid > 0))
6)
7/
สร้างตารางแล้ว
SQL> แก้ไขตารางและเพิ่มข้อ จำกัด การตรวจสอบ CK_T2 (tname ไม่ใช่ null);
ตารางมีการเปลี่ยนแปลง
SQL> เลือก t.constraint_name, t.table_name, t.status, t.deferrable จาก user_constraints t;
CONSTRAINT_NAME TABLE_NAME สถานะสามารถเลื่อนออกไปได้
-------------------------------------------------- -------------------------------------------------- ----------------------
CK_T1 T เปิดใช้งานแล้วไม่สามารถเลื่อนออกไปได้
CK_T2 T เปิดใช้งานแล้วไม่สามารถเลื่อนออกไปได้
เอสแอลแอล>
SQL> สร้างตาราง t
2 (
เลข 3 ตัว(8) ,
4 ชื่อ varchar2(10)
การตรวจสอบข้อ จำกัด 5 CK_T1 ((tid ไม่ใช่ null) และ (tid > 0))
6)
7/
สร้างตารางแล้ว
SQL> แก้ไขตารางและเพิ่มข้อ จำกัด การตรวจสอบ CK_T2 (tname ไม่ใช่ null);
ตารางมีการเปลี่ยนแปลง
SQL> เลือก t.constraint_name, t.table_name, t.status, t.deferrable จาก user_constraints t;
CONSTRAINT_NAME TABLE_NAME สถานะสามารถเลื่อนออกไปได้
-------------------------------------------------- -------------------------------------------------- ----------------------
CK_T1 T เปิดใช้งานแล้วไม่สามารถเลื่อนออกไปได้
CK_T2 T เปิดใช้งานแล้วไม่สามารถเลื่อนออกไปได้
เอสแอลแอล>
ข้อจำกัด CK_T1 ทำให้แน่ใจว่าคอลัมน์ tid ต้องไม่ว่างเปล่าและมีค่ามากกว่า 0 และ CK_T2 ทำให้แน่ใจว่า iname ต้องไม่ว่างเปล่า ข้อจำกัดในการตรวจสอบอาจเป็นกฎระหว่างคอลัมน์ต่างๆ ในแถวเดียวกันก็ได้
ข้อจำกัดที่ไม่ซ้ำใคร
วิธีการสร้าง: หากคอลัมน์ที่ไม่ซ้ำมีเพียงคอลัมน์เดียว สามารถกำหนดได้ในระดับคอลัมน์เท่านั้น หากคอลัมน์ที่ไม่ซ้ำมีหลายคอลัมน์ สามารถกำหนดได้ในระดับตารางเท่านั้น
ดู plaincopy ไปที่ clipboardprint หรือไม่
SQL> สร้างตาราง t2
2 (
3 ข้อ จำกัด หมายเลข vid VK_T1 ไม่ซ้ำกัน
4 ชื่อ varchar2(10),
5 เทียบกับ varchar2(10),
6 ข้อ จำกัด VK_T2 ที่ไม่ซ้ำกัน (vname, vsex)
7)
8/
สร้างตารางแล้ว
SQL> เลือก t.constraint_name, t.table_name, t.status, t.validated, t.deferrable จาก user_constraints t;
CONSTRAINT_NAME TABLE_NAME สถานะตรวจสอบแล้ว เลื่อนออกไปได้
--------- ---------- -------- ---------- ------- -------
VK_T1 T2 เปิดใช้งานแล้ว ตรวจสอบแล้วไม่เลื่อนออกไป
VK_T2 T2 เปิดใช้งานแล้ว ตรวจสอบแล้วไม่เลื่อนออกไป
เอสแอลแอล>
SQL> สร้างตาราง t2
2 (
3 ข้อ จำกัด หมายเลข vid VK_T1 ไม่ซ้ำกัน
4 ชื่อ varchar2(10),
5 เทียบกับ varchar2(10),
6 ข้อ จำกัด VK_T2 ที่ไม่ซ้ำกัน (vname, vsex)
7)
8/
สร้างตารางแล้ว
SQL> เลือก t.constraint_name, t.table_name, t.status, t.validated, t.deferrable จาก user_constraints t;
CONSTRAINT_NAME TABLE_NAME สถานะตรวจสอบแล้ว เลื่อนออกไปได้
--------- ---------- -------- ---------- ------- -------
VK_T1 T2 เปิดใช้งานแล้ว ตรวจสอบแล้วไม่เลื่อนออกไป
VK_T2 T2 เปิดใช้งานแล้ว ตรวจสอบแล้วไม่เลื่อนออกไป
เอสแอลแอล>
เมื่อสร้างข้อจำกัดเฉพาะแล้ว ดัชนีจะถูกสร้างขึ้น (อาจเป็นดัชนีที่ไม่ซ้ำกัน ดังนั้น อาจเป็นดัชนีที่ไม่ซ้ำก็ได้ ขึ้นอยู่กับว่าตารางถูกระบุเมื่อสร้างตารางหรือไม่ เพื่อตรวจสอบข้อจำกัดของข้อมูลทันทีเมื่อ ใส่ข้อมูลแล้ว):
ดู plaincopy ไปที่ clipboardprint หรือไม่
SQL> เลือก t.index_name, t.table_name, t.uniqueness จาก user_indexes t;
INDEX_NAME TABLE_NAME ความเป็นเอกลักษณ์
-
VK_T1 T2 ไม่ซ้ำกัน
VK_T2 T2 ไม่ซ้ำกัน
SQL> เลือก t.index_name, t.table_name, t.uniqueness จาก user_indexes t;
INDEX_NAME TABLE_NAME ความเป็นเอกลักษณ์
-
VK_T1 T2 ไม่ซ้ำกัน
VK_T2 T2 ไม่ซ้ำกัน
เนื่องจากมีดัชนี คุณจึงสามารถระบุตำแหน่งที่เก็บดัชนีและพารามิเตอร์หน่วยเก็บข้อมูลบางส่วนได้เมื่อสร้างตาราง
ดู plaincopy ไปที่ clipboardprint หรือไม่
SQL> สร้างตาราง t2
2 (
3 ข้อ จำกัด หมายเลข vid VK_T1 ไม่ซ้ำกัน
4 ชื่อ varchar2(10),
5 เทียบกับ varchar2(10),
6 ข้อ จำกัด VK_T2 เฉพาะ (vname, vsex) โดยใช้ดัชนี tablespace indx
ที่เก็บข้อมูล 7 แห่ง (เริ่มต้น 100,000 ถัดไป 100,000 pctincrease 0)
8 การไม่เข้าสู่ระบบ
9)
10/
สร้างตารางแล้ว
SQL> สร้างตาราง t2
2 (
3 ข้อ จำกัด หมายเลข vid VK_T1 ไม่ซ้ำกัน
4 ชื่อ varchar2(10),
5 เทียบกับ varchar2(10),
6 ข้อ จำกัด VK_T2 เฉพาะ (vname, vsex) โดยใช้ดัชนี tablespace indx
ที่เก็บข้อมูล 7 แห่ง (เริ่มต้น 100,000 ถัดไป 100,000 pctincrease 0)
8 การไม่เข้าสู่ระบบ
9)
10/
สร้างตารางแล้ว
พื้นที่ตารางที่เก็บดัชนีที่มีข้อจำกัดคือพื้นที่ตาราง indx ขนาดบล็อกเริ่มต้นคือ 100k และไม่มีการสร้างบันทึกสำหรับการดำเนินการ dml (แต่บันทึกยังถูกสร้างขึ้นด้วยเหตุผลอื่นด้วย แต่มีบันทึกน้อยกว่าการบันทึกเริ่มต้น)
คีย์หลัก ข้อจำกัดของคีย์หลัก
วิธีการสร้าง: คีย์หลักส่วนใหญ่ประกอบด้วยค่าที่ไม่เป็นค่าว่างและไม่ซ้ำกัน ตารางสามารถมีคีย์หลักได้เพียงคีย์เดียว แต่คีย์หลักสามารถมีได้หลายคอลัมน์
ดู plaincopy ไปที่ clipboardprint หรือไม่
SQL> สร้างตาราง t2
2 (
3 ข้อ จำกัด หมายเลข vid VK_T1 ไม่ซ้ำกัน
4 ชื่อ varchar2(10),
5 เทียบกับ varchar2(10),
6 ข้อ จำกัด คีย์หลัก VK_T2 (vname, vsex) โดยใช้ดัชนี tablespace indx
ที่เก็บข้อมูล 7 แห่ง (เริ่มต้น 100,000 ถัดไป 100,000 pctincrease 0)
8 การไม่เข้าสู่ระบบ
9)
10/
สร้างตารางแล้ว
SQL> สร้างตาราง t2
2 (
3 ข้อ จำกัด หมายเลข vid VK_T1 ไม่ซ้ำกัน
4 ชื่อ varchar2(10),
5 เทียบกับ varchar2(10),
6 ข้อ จำกัด คีย์หลัก VK_T2 (vname, vsex) โดยใช้ดัชนี tablespace indx
ที่เก็บข้อมูล 7 แห่ง (เริ่มต้น 100,000 ถัดไป 100,000 pctincrease 0)
8 การไม่เข้าสู่ระบบ
9)
10/
สร้างตารางแล้ว
คีย์ต่างประเทศ คีย์ต่างประเทศ
วิธีการสร้าง: ตารางที่เกี่ยวข้องกับคีย์ต่างประเทศสามารถมีได้สองตารางหรือหนึ่งตาราง ในกรณีของสองตาราง คีย์ที่อ้างอิงโดยเขตข้อมูลในตารางลูกจะต้องเป็นคีย์หลักในตารางที่อ้วนกว่า ข้อจำกัดถูกสร้างขึ้นในตารางลูก โดยระบุว่าค่าในช่องในตารางต้องมีอยู่ในตารางหลักหรือเป็นค่า NULL
ดู plaincopy ไปที่ clipboardprint หรือไม่
SQL> สร้างแผนกตาราง
2 (
3 ทำหมายเลข (8)
4 ชื่อ varchar2(20)
คีย์หลัก PK_DEPT ข้อจำกัด 5 รายการ (ทำ)
6)
7/
สร้างตารางแล้ว
เอสแอลแอล>
SQL> สร้างตาราง emp
2 (
3 หมายเลข Eid (8) คีย์หลัก
4 ชื่อ varchar2(20)
5 หมายเลข (8) /*แผนกอ้างอิง(ได้)*/,
6 ชื่อ varchar2(20),
7 ข้อ จำกัด FK_EMP2 คีย์ต่างประเทศ (ทำ) อ้างอิงแผนก (ทำ)
8)
9/
สร้างตารางแล้ว
SQL> สร้างแผนกตาราง
2 (
3 ทำหมายเลข (8)
4 ชื่อ varchar2(20)
คีย์หลัก PK_DEPT ข้อจำกัด 5 รายการ (ทำ)
6)
7/
สร้างตารางแล้ว
เอสแอลแอล>
SQL> สร้างตาราง emp
2 (
3 หมายเลข Eid (8) คีย์หลัก
4 ชื่อ varchar2(20)
5 หมายเลข (8) /*แผนกอ้างอิง(ได้)*/,
6 ชื่อ varchar2(20),
7 ข้อ จำกัด FK_EMP2 คีย์ต่างประเทศ (ทำ) อ้างอิงแผนก (ทำ)
8)
9/
สร้างตารางแล้ว
เนื่องจากคีย์ต่างประเทศ (คีย์ต่างประเทศ) ถูกกำหนดโดยคีย์อ้างอิง (คีย์อ้างอิง) จึงจะมีข้อจำกัดเมื่อดำเนินการอัปเดต วาง ลบ และการดำเนินการอื่น ๆ บนตาราง fater โดยเฉพาะอย่างยิ่ง จะถูกกำหนดโดยสถานะของข้อจำกัดของคีย์ต่างประเทศ
ลบในการดำเนินการ ลบ cascade ลบ set null
Delete on action เป็นการตั้งค่าเริ่มต้น หากคุณลบข้อมูลในตาราง fater Oracle จะล็อคตารางคำแล้วสแกนตาราง (หากมีคอลัมน์คีย์นอก ให้สแกนดัชนี) จากนั้นข้อมูลจะไม่มีอยู่ใน อนุญาตให้ลบคอลัมน์คีย์ต่างประเทศในตารางลูก
ลบน้ำตกจะลบแถวที่เกี่ยวข้องในตารางคำด้วย
ลบชุด null ข้อมูลที่สอดคล้องกับคอลัมน์คีย์ต่างประเทศในตารางบาร์จะกลายเป็น NULL
ดู plaincopy ไปที่ clipboardprint หรือไม่
สร้างตารางว่าง
-
หมายเลข Eid (8) คีย์หลัก
เอเนม varchar2(20),
ทำหมายเลข(8) /*แผนกอ้างอิง(ทำ)*/,
ชื่อ varchar2(20),
ข้อ จำกัด FK_EMP2 คีย์ต่างประเทศ (ทำ) อ้างอิงแผนก (ทำ) เมื่อลบชุด null
-
สร้างตารางว่าง
-
หมายเลข Eid (8) คีย์หลัก
เอเนม varchar2(20),
ทำหมายเลข(8) /*แผนกอ้างอิง(ทำ)*/,
ชื่อ varchar2(20),
ข้อ จำกัด FK_EMP2 คีย์ต่างประเทศ (ทำ) อ้างอิงแผนก (ทำ) เมื่อลบชุด null
-