哪一个表包含关于约束的详细信息(例如外键引用的表)?表'all_cons_columns','all_constraints'只包含约束的名称,这不是很有帮助。我目前正在使用dbms_metadata.get_ddl(),但它并不适用于所有数据库。
amrnrhlw1#
这一切都在那里:ALL_CONSTRAINTS中的列R_CONSTRAINT_NAME包含外键的被引用PK/UK约束条件的名称。然后,可以查找该约束条件以获取引用表的TABLE_NAME。在查看ALL_CONS_COLUMNS时,外键中列的POSITION将与主键/唯一键中列的POSITION匹配。
dzhpxtsq2#
此语句列出表,约束条件名称与外键表名称:
select c.table_name,c.constraint_name, --c.r_constraint_name, cc.table_namefrom all_constraints cinner join all_constraints cc on c.r_constraint_name = cc.constraint_name
select c.table_name,c.constraint_name, --c.r_constraint_name,
cc.table_name
from all_constraints c
inner join all_constraints cc on c.r_constraint_name = cc.constraint_name
kyxcudwk3#
为了检索外键并生成一个脚本来创建它们,可以使用以下查询:
SELECT 'ALTER TABLE ' || a.table_name || ' ADD CONSTRAINT ' || a.constraint_name || ' FOREIGN KEY (' || a.column_name || ') REFERENCES ' || jcol.table_name || ' (' || jcol.column_name || ');' as commandforeignFROM (SELECT uc.table_name, uc.constraint_name, uc.r_constraint_name, col.column_name FROM USER_CONSTRAINTS uc, USER_CONS_COLUMNS col WHERE uc.constraint_type='R' and uc.constraint_name=col.constraint_name) a INNER JOIN USER_CONS_COLUMNS jcol ON a.r_constraint_name=jcol.constraint_name;
SELECT
'ALTER TABLE ' || a.table_name || ' ADD CONSTRAINT ' || a.constraint_name
|| ' FOREIGN KEY (' || a.column_name || ') REFERENCES ' || jcol.table_name
|| ' (' || jcol.column_name || ');' as commandforeign
FROM
(SELECT
uc.table_name, uc.constraint_name, uc.r_constraint_name, col.column_name
USER_CONSTRAINTS uc, USER_CONS_COLUMNS col
WHERE
uc.constraint_type='R' and uc.constraint_name=col.constraint_name) a
INNER JOIN
USER_CONS_COLUMNS jcol
ON
a.r_constraint_name=jcol.constraint_name;
tvz2xvvm4#
看一看:Reverse Engineering a Data Model。基于此,我做了一个Python program that dumps Oracle db schema to text。有PRIMARY_KEYS_INFO_SQL和FOREIGN_KEYS_INFO_SQL可以做你感兴趣的事情。
PRIMARY_KEYS_INFO_SQL
FOREIGN_KEYS_INFO_SQL
m4pnthwp5#
使用Oracle XE示例数据库。我想标识模式/表上的主键和外键。下面是如何...
SELECT acc.column_name, ac.constraint_type, ac.status, fkc.table_name, fkc.column_name FROM all_cons_columns acc LEFT JOIN all_constraints ac ON ac.constraint_name = acc.constraint_name LEFT OUTER JOIN all_cons_columns fkc ON fkc.constraint_name = ac.r_constraint_name WHERE acc.owner = 'OT' AND acc.table_name = 'ORDERS' AND ac.constraint_type IN ('P', 'R');
SELECT acc.column_name, ac.constraint_type, ac.status, fkc.table_name, fkc.column_name
FROM all_cons_columns acc
LEFT JOIN all_constraints ac ON ac.constraint_name = acc.constraint_name
LEFT OUTER JOIN all_cons_columns fkc ON fkc.constraint_name = ac.r_constraint_name
WHERE acc.owner = 'OT'
AND acc.table_name = 'ORDERS'
AND ac.constraint_type IN ('P', 'R');
输出(格式化列宽后)如下所示...
COLUMN_NAME C STATUS TABLE_NAME COLUMN_NAME-------------------- - -------- -------------------- --------------------ORDER_ID P ENABLEDCUSTOMER_ID R ENABLED CUSTOMERS CUSTOMER_IDSALESMAN_ID R ENABLED EMPLOYEES EMPLOYEE_ID
COLUMN_NAME C STATUS TABLE_NAME COLUMN_NAME
-------------------- - -------- -------------------- --------------------
ORDER_ID P ENABLED
CUSTOMER_ID R ENABLED CUSTOMERS CUSTOMER_ID
SALESMAN_ID R ENABLED EMPLOYEES EMPLOYEE_ID
在这里,我们可以看到(对于ORDERS表)ORDER_ID是主键,并且有两个外键分别引用CUSTOMERS表和EMPLOYEES表。
5条答案
按热度按时间amrnrhlw1#
这一切都在那里:ALL_CONSTRAINTS中的列R_CONSTRAINT_NAME包含外键的被引用PK/UK约束条件的名称。然后,可以查找该约束条件以获取引用表的TABLE_NAME。
在查看ALL_CONS_COLUMNS时,外键中列的POSITION将与主键/唯一键中列的POSITION匹配。
dzhpxtsq2#
此语句列出表,约束条件名称与外键表名称:
kyxcudwk3#
为了检索外键并生成一个脚本来创建它们,可以使用以下查询:
tvz2xvvm4#
看一看:Reverse Engineering a Data Model。基于此,我做了一个Python program that dumps Oracle db schema to text。有
PRIMARY_KEYS_INFO_SQL
和FOREIGN_KEYS_INFO_SQL
可以做你感兴趣的事情。m4pnthwp5#
使用Oracle XE示例数据库。我想标识模式/表上的主键和外键。下面是如何...
输出(格式化列宽后)如下所示...
在这里,我们可以看到(对于ORDERS表)ORDER_ID是主键,并且有两个外键分别引用CUSTOMERS表和EMPLOYEES表。