รายการข้อ จำกัด จากฐานข้อมูล MySQL


92

ฉันจะรับรายการข้อ จำกัด ทั้งหมดจากฐานข้อมูลเฉพาะได้อย่างไร


1
MySQL มีข้อ จำกัด มากกว่าหนึ่งประเภท คุณหมายถึงอะไร? คุณสามารถยกตัวอย่างของสิ่งที่คุณกำลังมองหาได้หรือไม่?
Mark Byers

คำตอบ:


146

ใช้information_schema.table_constraintsตารางเพื่อรับชื่อของข้อ จำกัด ที่กำหนดไว้ในแต่ละตาราง:

select *
from information_schema.table_constraints
where constraint_schema = 'YOUR_DB'

ใช้information_schema.key_column_usageตารางเพื่อรับฟิลด์ในแต่ละข้อ จำกัด เหล่านี้:

select *
from information_schema.key_column_usage
where constraint_schema = 'YOUR_DB'

หากคุณกำลังพูดถึงข้อ จำกัด ของ Foreign Key ให้ใช้information_schema.referential_constraints:

select *
from information_schema.referential_constraints
where constraint_schema = 'YOUR_DB'

1
รายการนี้จะรวมเฉพาะข้อ จำกัด UNIQUE, PRIMARY KEY หรือ FOREIGN KEY เท่านั้น ตรวจสอบได้ แต่ไม่ได้บังคับใช้ ข้อ จำกัด DEFAULT จะไม่สามารถมองเห็นได้โดยใช้แบบสอบถามนี้
OMG Ponies

MySQL ไม่จัดเก็บข้อ จำกัด ในการตรวจสอบ หากคุณพยายามกำหนดอย่างใดอย่างหนึ่งระบบจะแยกวิเคราะห์และละทิ้งมัน
Bill Karwin

1
ค่าเริ่มต้นไม่นับเป็นข้อ จำกัด มันถูกเก็บไว้ในinformation_schema.columns.column_default.
Bill Karwin

22

คำตอบที่ยอดเยี่ยมโดย @Senseful

ฉันกำลังนำเสนอข้อความค้นหาที่แก้ไขสำหรับผู้ที่กำลังมองหารายชื่อข้อ จำกัด เท่านั้น (ไม่ใช่รายละเอียด / คอลัมน์อื่น ๆ ):

SELECT DISTINCT(constraint_name) 
FROM information_schema.table_constraints 
WHERE constraint_schema = 'YOUR_DB' 
ORDER BY constraint_name ASC;

2
หากคุณต้องการลบเมื่อพบแล้วโปรดดูที่นี่stackoverflow.com/a/838412/2401804
r3wt

9

สิ่งนี้จะช่วยได้มากหากคุณต้องการดูข้อ จำกัด ของคีย์หลักและคีย์ต่างประเทศตลอดจนกฎเกี่ยวกับข้อ จำกัด เหล่านั้นเช่น ON_UPDATE และ ON_DELETE และชื่อคอลัมน์และคอลัมน์ต่างประเทศทั้งหมดรวมกัน:

SELECT tc.constraint_schema,tc.constraint_name,tc.table_name,tc.constraint_type,kcu.table_name,kcu.column_name,kcu.referenced_table_name,kcu.referenced_column_name,rc.update_rule,rc.delete_rule

FROM information_schema.table_constraints tc

inner JOIN information_schema.key_column_usage kcu
ON tc.constraint_catalog = kcu.constraint_catalog
AND tc.constraint_schema = kcu.constraint_schema
AND tc.constraint_name = kcu.constraint_name
AND tc.table_name = kcu.table_name

LEFT JOIN information_schema.referential_constraints rc
ON tc.constraint_catalog = rc.constraint_catalog
AND tc.constraint_schema = rc.constraint_schema
AND tc.constraint_name = rc.constraint_name
AND tc.table_name = rc.table_name

WHERE tc.constraint_schema = 'my_db_name'

คุณอาจต้องการเพิ่มข้อมูลเพิ่มเติมเกี่ยวกับคอลัมน์เหล่านั้นเพียงเพิ่มข้อมูลนี้ลงใน SQL (และเลือกคอลัมน์ที่คุณต้องการ):

LEFT JOIN information_schema.COLUMNS c
ON kcu.constraint_schema = c.table_schema
AND kcu.table_name = c.table_name
AND kcu.column_name = c.column_name

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.