الاستعلام عن علاقات المفاتيح الخارجية للجدول
سؤال
بالنسبة لجدول "foo" محدد، أحتاج إلى استعلام لإنشاء مجموعة من الجداول التي تحتوي على مفاتيح خارجية تشير إلى foo.أنا أستخدم أوراكل 10G.
المحلول
يجب أن يعمل هذا (أو شيء قريب):
select table_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 here>');
نصائح أخرى
وينبغي إعطاء البيان التالي للأطفال وجميع نسلهم.لقد قمت باختباره على قاعدة بيانات Oracle 10.
SELECT level, main.table_name parent,
link.table_name child
FROM user_constraints main, user_constraints link
WHERE main.constraint_type IN ('P', 'U')
AND link.r_constraint_name = main.constraint_name
START WITH main.table_name LIKE UPPER('&&table_name')
CONNECT BY main.table_name = PRIOR link.table_name
ORDER BY level, main.table_name, link.table_name
فيما يلي كيفية اتخاذ استعلام مايك خطوة أخرى إلى الأمام للحصول على أسماء الأعمدة من أسماء القيد:
select * from user_cons_columns
where constraint_name in (
select 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 name here>'));
رابط ل وثائق قاعدة بيانات أوراكل على الإنترنت
قد ترغب في استكشاف طرق عرض قاموس البيانات.لديهم البادئات:
- مستخدم
- الجميع
- ديسيبل
عينة:
select * from dictionary where table_name like 'ALL%'
استمرارًا لمثال مايك، قد ترغب في إنشاء برامج نصية لتمكين/تعطيل القيود.لقد قمت بتعديل "التحديد" في الصف الأول فقط.
select 'alter table ' || TABLE_NAME || ' disable constraint ' || 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 here>');
أعلم أن الوقت قد فات للإجابة ولكن دعني أجيب على أي حال، بعض الإجابات المذكورة أعلاه معقدة للغاية، ومن ثم إليك طريقة أبسط بكثير.
`SELECT a.table_name child_table, a.column_name child_column, a.constraint_name, b.table_name parent_table, b.column_name parent_column FROM all_cons_columns a JOIN all_constraints c ON a.owner = c.owner AND a.constraint_name = c.constraint_name join all_cons_columns b on c.owner = b.owner and c.r_constraint_name = b.constraint_name WHERE c.constraint_type = 'R' AND a.table_name = 'your table name'`
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;
قم بتنزيل دليل Oracle المرجعي لـ 10G الذي يشرح جداول قاموس البيانات.
الإجابات أعلاه جيدة ولكن راجع الجداول الأخرى التي قد تتعلق بالقيود.
SELECT * FROM DICT WHERE TABLE_NAME LIKE '%CONS%';
أخيرًا، احصل على أداة مثل Toad أو SQL Developer التي تسمح لك بتصفح هذه الأشياء في واجهة المستخدم، فأنت بحاجة إلى تعلم كيفية استخدام الجداول ولكن يجب عليك استخدام واجهة المستخدم أيضًا.