2017-08-03 1 views
0

Je veux écrire un SQL pour vérifier FK'S. Ce que j'ai obtenu jusqu'à présent:Oracle SQL: Table cible étrangère clé

SELECT OWNER, 
     CONSTRAINT_TYPE, 
     TABLE_NAME, 
     R_OWNER, 
     R_CONSTRAINT_NAME 
    FROM ALL_CONSTRAINTS 
WHERE  OWNER = 'XXX' 
     AND TABLE_NAME = 'XXX' 
     AND CONSTRAINT_TYPE = 'R' 

Le problème: je ne vois pas où le FK est mappé. Vous avez R_OWNER et R_CONSTRAINT_NAME, mais pas R_TABLE. Y at-il de toute façon cela peut être fait en écrivant SQL?

Répondre

0

MISE À JOUR.

Cela vous donne ce que vous voulez:

select 
    cc.owner, 
    cc.constraint_name, 
    cc.table_name, 
    cc.column_name, 
    c.r_owner, 
    c_pk.table_name r_table_name, 
    c_pk.constraint_name r_pk 
from all_cons_columns cc 
join all_constraints c on cc.owner = c.owner and cc.constraint_name = c.constraint_name 
join all_constraints c_pk on c.r_owner = c_pk.owner and c.r_constraint_name = c_pk.constraint_name 
where c.constraint_type = 'R' 
and cc.owner = 'XXX' 
and cc.table_name = 'XXX'; 
+0

Une question: quel est le but de rejoindre all_constraints avec all_constraints? – Letterdief

+0

Eh bien, vous obtenez différentes lignes de la même vue afin de les joindre ensemble. Il n'y a rien d'inhabituel à utiliser la même table ou vue dans la même requête si c'est pour le but. – ZZa

-1

Vous pouvez obtenir la liste de toutes les clés étrangères existantes:

  SELECT RC.CONSTRAINT_NAME FK_Name, 
       KF.TABLE_SCHEMA FK_Schema, 
       KF.TABLE_NAME FK_Table, 
       KF.COLUMN_NAME FK_Column, 
       RC.UNIQUE_CONSTRAINT_NAME PK_Name, 
       KP.TABLE_SCHEMA PK_Schema, 
       KP.TABLE_NAME PK_Table, 
       KP.COLUMN_NAME PK_Column, 
       RC.MATCH_OPTION MatchOption, 
       RC.UPDATE_RULE UpdateRule, 
       RC.DELETE_RULE DeleteRule 
     FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC 
      JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KF ON RC.CONSTRAINT_NAME = KF.CONSTRAINT_NAME 
      JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KP ON RC.UNIQUE_CONSTRAINT_NAME = KP.CONSTRAINT_NAME; 
+0

Il n'y a pas 'information_schema' dans Oracle –

+0

sur Google j'ai recherché et son disponible dans Oracle aussi, reportez-vous à créer un lien https://docs.oracle.com /cd/E19078-01/mysql/mysql-refman-5.0/information-schema.html –

+0

Non, ce n'est pas le cas. Ne croyez pas un coup aléatoire sur Google sans vérifier. [Lire le manuel] (http://docs.oracle.com/database/121/REFRN/toc.htm) au lieu de –