ฉันจะค้นหาตารางใดที่อ้างอิงตารางที่กำหนดใน Oracle SQL Developer


200

ในOracle SQL Developerหากฉันกำลังดูข้อมูลบนตารางฉันสามารถดูข้อ จำกัด ที่ให้ฉันเห็นคีย์ต่างประเทศ (และตารางใดที่อ้างอิงโดยตารางนี้) และฉันสามารถดูการพึ่งพาเพื่อดูว่าอะไร แพคเกจและการอ้างอิงตารางดังกล่าว แต่ฉันไม่แน่ใจว่าจะหาตารางใดอ้างอิงตาราง

ตัวอย่างเช่นสมมติว่าฉันกำลังดูempตาราง มีอีกตารางหนึ่งemp_deptที่จับพนักงานที่ทำงานในแผนกซึ่งอ้างอิงถึงempตารางผ่านemp_idซึ่งเป็นคีย์หลักของempตาราง มีวิธี (ผ่านองค์ประกอบ UI บางอย่างในโปรแกรมไม่ใช่ผ่าน SQL) เพื่อค้นหาว่าemp_deptตารางอ้างอิงempตารางโดยที่ฉันไม่ต้องรู้ว่ามีemp_deptตารางอยู่หรือไม่

คำตอบ:


259

ไม่ไม่มีตัวเลือกดังกล่าวจาก Oracle SQL Developer

คุณต้องดำเนินการแบบสอบถามด้วยตนเองหรือใช้เครื่องมืออื่น (ตัวอย่างเช่นนักพัฒนา PLSQLมีตัวเลือกดังกล่าว) SQL ต่อไปนี้เป็นที่ใช้โดย PLSQL Developer:

select table_name, constraint_name, status, owner
from all_constraints
where r_owner = :r_owner
and constraint_type = 'R'
and r_constraint_name in
 (
   select constraint_name from all_constraints
   where constraint_type in ('P', 'U')
   and table_name = :r_table_name
   and owner = :r_owner
 )
order by table_name, constraint_name

r_ownerสคีมาอยู่ที่ไหนและr_table_nameเป็นตารางที่คุณกำลังมองหาการอ้างอิง ชื่อเป็นกรณี ๆ ไป


ระวังเพราะในแท็บรายงานของ Oracle SQL Developer มีตัวเลือก "All tables / Dependencies" ซึ่งมาจากALL_DEPENDENCIESซึ่งหมายถึง "การพึ่งพาระหว่างโพรซีเดอร์แพคเกจฟังก์ชั่นแพ็คเกจและทริกเกอร์เข้าถึงผู้ใช้ปัจจุบันรวมถึงการพึ่งพา ในมุมมองที่สร้างโดยไม่มีลิงก์ฐานข้อมูลใด ๆ " . จากนั้นรายงานนี้ไม่มีค่าสำหรับคำถามของคุณ


30
ขอบคุณสำหรับคำตอบ. อัปยศใน Oracle Sql Developer สำหรับการดูด
Greg

1
คุณพูดถึง PLSQL Developer ความสามารถในการทำฟังก์ชั่นนี้คุณสามารถอธิบายได้อย่างไร?
นิโคลัส

4
@Nicholas ในเบราว์เซอร์วัตถุให้เลือกตารางคลิกขวาบนโต๊ะแล้วเลือก "Foreign Key Reference"
FerranB

3
คำตอบนี้อ้างอิงว่า SQL Developer 4.1 ขึ้นไปมีตัวเลือกแท็บ "Model" ที่จะแสดงข้อมูลนี้ในรูปแบบ ERD
SnoringFrog

1
r_owner เป็นสคีมาที่คุณใช้อยู่ r_table_name เป็นตารางที่คุณกำลังมองหาข้อมูลอ้างอิง
Flowy

108

หากต้องการเพิ่มสิ่งนี้ใน SQL Developer เป็นส่วนขยายให้ทำดังนี้:

  1. บันทึกรหัสด้านล่างลงในไฟล์ xml (เช่น fk_ref.xml):
<items>
    <item type="editor" node="TableNode" vertical="true">
    <title><![CDATA[FK References]]></title>
    <query>
        <sql>
            <![CDATA[select a.owner,
                            a.table_name,
                            a.constraint_name,
                            a.status
                     from   all_constraints a
                     where  a.constraint_type = 'R'
                            and exists(
                               select 1
                               from   all_constraints
                               where  constraint_name=a.r_constraint_name
                                      and constraint_type in ('P', 'U')
                                      and table_name = :OBJECT_NAME
                                      and owner = :OBJECT_OWNER)
                               order by table_name, constraint_name]]>
        </sql>
    </query>
    </item>
</items>
  1. เพิ่มส่วนขยายไปที่ SQL Developer:

    • เครื่องมือ> ค่ากำหนด
    • ฐานข้อมูล> ส่วนขยายที่กำหนดโดยผู้ใช้
    • คลิกปุ่ม "เพิ่มแถว"
    • ในประเภทให้เลือก "EDITOR" สถานที่ตั้งเป็นที่ที่คุณบันทึกไฟล์ xml ด้านบน
    • คลิก "ตกลง" จากนั้นเริ่มนักพัฒนา SQL ใหม่
  2. นำทางไปยังตารางใดก็ได้และคุณควรเห็นแท็บเพิ่มเติมถัดจาก SQL หนึ่งชื่อการอ้างอิง FK ซึ่งแสดงข้อมูล FK ใหม่

  3. การอ้างอิง


คุณรู้ชื่อโหนดสำหรับแพ็คเกจหรือไม่ ลิงก์ xsd ทั้งหมดที่ฉันพบบนเว็บไม่สามารถใช้งานได้อีกต่อไป (เช่นเดียวกับที่ Oracle ลบออก)
James Sumners

1
ฉันได้เพิ่มการเปลี่ยนแปลงเล็กน้อยในข้อเสนอแนะของคุณ: และ owner = user ก่อนการสั่งซื้อโดยหากคุณมีอินสแตนซ์สองตารางที่เหมือนกันในสองสกีมาคุณจะได้รับการอ้างอิงที่เกี่ยวข้องกับสคีมาของคุณเท่านั้น
user1708042

ฉันเพิ่มเงื่อนไขนี้: ก่อนand owner = :OBJECT_OWNER and exists
M Denis

3
@ M-Denis ในกรณีนี้คุณอาจพลาดการอ้างอิงจาก schema อื่น ๆ
คุณจะ

หลังจากใช้สิ่งนี้และทำงานอยู่describe books;และselect * from books;จะไม่แสดงแท็บการอ้างอิง fk บน Oracle sql developer VM
mLstudent33

36

แทนที่ [ตารางของคุณ] ด้วยEMPในแบบสอบถามด้านล่าง

select owner,constraint_name,constraint_type,table_name,r_owner,r_constraint_name
  from all_constraints 
 where constraint_type='R'
   and r_constraint_name in (select constraint_name 
                               from all_constraints 
                              where constraint_type in ('P','U') 
                                and table_name='[YOUR TABLE]');

ฉันคิดว่าconstraint_type in ('P','U') ไม่จำเป็นเพราะถ้า constraint_type ของข้อ จำกัด TOTO คือ 'R' r_constraint_name ของ TOTO นั้นแน่นอนว่าชื่อของข้อ จำกัด ประเภท 'P' หรือ 'U' ในตารางอ้างอิง ไม่จำเป็นต้องระบุ คุณกำลังใช้INงานอยู่ดังนั้นมันจึงเหมือนเป็นจำนวนมากORและเราสนใจเฉพาะตัวถูกดำเนินการของ OR เท่านั้นซึ่งประเมินว่าเป็นจริง
Gab 是好人

11

คุณอาจจะสามารถสอบถามสิ่งนี้จากALL_CONSTRAINTSมุมมอง:

SELECT table_name
FROM ALL_CONSTRAINTS
WHERE constraint_type = 'R' -- "Referential integrity"
  AND r_constraint_name IN
    ( SELECT constraint_name
      FROM ALL_CONSTRAINTS
      WHERE table_name = 'EMP'
        AND constraint_type IN ('U', 'P') -- "Unique" or "Primary key"
    );

1
คีย์ต่างประเทศสามารถอ้างอิงคีย์ที่ไม่ซ้ำกันไม่ได้เป็นเพียงคีย์หลักและชื่อตารางสามารถใช้ในหลายสคีมาซึ่งจะส่งผลให้เกิดการแข่งขันหลายรายการ คุณต้องใช้คอลัมน์ 'เจ้าของ' เช่นกันหากคุณจะใช้ 'All_Constraints' ไม่ใช่ 'User_Constraints'
Mark Roddy

1
ขอบคุณที่ให้ความเห็นว่า 'R' 'U' และ 'P' คืออะไร
Jeff

อย่าลืมเครื่องหมายอัฒภาคเมื่อสิ้นสุดการร้องขอ SQL
Gab 是好人

อย่างไรก็ตาม, constraint_type ใน ('P', 'U') นั้นไม่จำเป็นเพราะถ้า constraint_type ของข้อ จำกัด TOTO คือ 'R', r_constraint_name ของ TOTO นั้นแน่นอนว่าชื่อของประเภท 'P' หรือ 'U 'ในตารางอ้างอิง ไม่จำเป็นต้องระบุ
Gab 是好人

9

SQL Developer 4.1 ซึ่งวางจำหน่ายในเดือนพฤษภาคม 2558 ได้เพิ่มแท็บ Model ซึ่งแสดงคีย์ต่างประเทศของตารางซึ่งอ้างถึงตารางของคุณในรูปแบบ Entity Relationship Diagram


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

1
@SnoringFrog ในทางเทคนิคแล้วคำถามจะถามถึงองค์ประกอบ UI ดังนั้นนี่คือคำตอบที่เหมาะสมที่สุด
WhatsThePoint

4

เกี่ยวกับบางสิ่งเช่นนี้:

SELECT c.constraint_name, c.constraint_type, c2.constraint_name, c2.constraint_type, c2.table_name
  FROM dba_constraints c JOIN dba_constraints c2 ON (c.r_constraint_name = c2.constraint_name)
 WHERE c.table_name = <TABLE_OF_INTEREST>
   AND c.constraint_TYPE = 'R';

2
สิ่งนี้ได้ผลสำหรับฉันเมื่อฉันเปลี่ยนชื่อตารางจากdba_constraintsเป็นall_constraintsเช่น:SELECT c.constraint_name, c.constraint_type, c2.constraint_name, c2.constraint_type, c2.table_name FROM all_constraints c JOIN all_constraints c2 ON (c.r_constraint_name = c2.constraint_name) WHERE c.table_name = '<TABLE_OF_INTEREST>' AND c.constraint_TYPE = 'R';
chrisjleu

4
SELECT DISTINCT table_name, 
                constraint_name, 
                column_name, 
                r_table_name, 
                position, 
                constraint_type 
FROM   (SELECT uc.table_name, 
               uc.constraint_name, 
               cols.column_name, 
               (SELECT table_name 
                FROM   user_constraints 
                WHERE  constraint_name = uc.r_constraint_name) r_table_name, 
               (SELECT column_name 
                FROM   user_cons_columns 
                WHERE  constraint_name = uc.r_constraint_name 
                       AND position = cols.position)           r_column_name, 
               cols.position, 
               uc.constraint_type 
        FROM   user_constraints uc 
               inner join user_cons_columns cols 
                       ON uc.constraint_name = cols.constraint_name 
        WHERE  constraint_type != 'C') 
START WITH table_name = '&&tableName' 
           AND column_name = '&&columnName' 
CONNECT BY NOCYCLE PRIOR table_name = r_table_name 
                         AND PRIOR column_name = r_column_name; 

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

นั่นเจ๋งจริงๆ - ทำงานได้ดี ฉันจะเพิ่มที่ต่ำกว่า () เพื่อเปรียบเทียบ table_name และ column_name
โทเบียสออตโต

4

สิ่งนี้อยู่ในผลิตภัณฑ์มานานหลายปี - แม้ว่าจะไม่ได้อยู่ในผลิตภัณฑ์ในปี 2011

แต่เพียงคลิกที่หน้ารูปแบบ

ตรวจสอบให้แน่ใจว่าคุณใช้เวอร์ชัน 4.0 เป็นอย่างน้อย (เปิดตัวในปี 2013) เพื่อเข้าถึงคุณลักษณะนี้

ป้อนคำอธิบายรูปภาพที่นี่


0

หากต้องการเพิ่มคำตอบข้างต้นสำหรับปลั๊กอินสำหรับนักพัฒนา sql การใช้ xml ด้านล่างจะช่วยในการรับคอลัมน์ที่เกี่ยวข้องกับ foreign key

    <items>
        <item type="editor" node="TableNode" vertical="true">
        <title><![CDATA[FK References]]></title>
        <query>
            <sql>
                <![CDATA[select a.owner,
                                a.constraint_name,
                                a.table_name,
                                b.column_name,
                                a.status
                         from   all_constraints a
                         join   all_cons_columns b ON b.constraint_name = a.constraint_name
                         where  a.constraint_type = 'R'
                                and exists(
                                   select 1
                                   from   all_constraints
                                   where  constraint_name=a.r_constraint_name
                                          and constraint_type in ('P', 'U')
                                          and table_name = :OBJECT_NAME
                                          and owner = :OBJECT_OWNER)
                                   order by table_name, constraint_name]]>
            </sql>
        </query>
        </item>
    </items>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.