外键引用涉及列的相关查询测试

阅读 21

01-12 15:00

一、oracle中如何查询一张表上的哪个列有作为其它表外键引用列的相关测试.
1、原表数据
hr@ORCLPDB> select * from employees;

EMPLOYEE_ID FIRST_NAME           LAST_NAME                 EMAIL                     PHONE_NUMBER         HIRE_DATE           JOB_ID         SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
----------- -------------------- ------------------------- ------------------------- -------------------- ------------------- ---------- ---------- -------------- ---------- -------------
        100 Steven               King                      SKING                     515.123.4567         2011-06-17 00:00:00 AD_PRES         24000                                      90
        101 Neena                Kochhar                   NKOCHHAR                  515.123.4568         2009-09-21 00:00:00 AD_VP           17000                       100            90
        102 Lex                  De Haan                   LDEHAAN                   515.123.4569         2009-01-13 00:00:00 AD_VP           17000                       100            90
        103 Alexander            Hunold                    AHUNOLD                   590.423.4567         2014-01-03 00:00:00 IT_PROG          9000                       102            60
        104 Bruce                Ernst                     BERNST                    590.423.4568         2015-05-21 00:00:00 IT_PROG          6000                       103            60
        107 Diana                Lorentz                   DLORENTZ                  590.423.5567         2015-02-07 00:00:00 IT_PROG          4200                       103            60
        124 Kevin                Mourgos                   KMOURGOS                  650.123.5234         2015-11-16 00:00:00 ST_MAN           5800                       100            50
        141 Trenna               Rajs                      TRAJS                     650.121.8009         2011-10-17 00:00:00 ST_CLERK         3500                       124            50
        142 Curtis               Davies                    CDAVIES                   650.121.2994         2013-01-29 00:00:00 ST_CLERK         3100                       124            50
        143 Randall              Matos                     RMATOS                    650.121.2874         2014-03-15 00:00:00 ST_CLERK         3000                       124            50
        144 Peter                Vargas                    PVARGAS                   650.121.2004         2014-07-09 00:00:00 ST_CLERK         3000                       124            50
        149 Eleni                Zlotkey                   EZLOTKEY                  011.44.1344.429018   2016-01-29 00:00:00 SA_MAN          10500             .2        100            80
        174 Ellen                Abel                      EABEL                     011.44.1644.429267   2012-05-11 00:00:00 SA_REP          11000             .3        149            80
        176 Jonathon             Taylor                    JTAYLOR                   011.44.1644.429265   2014-03-24 00:00:00 SA_REP           8600             .2        149            80
        178 Kimberely            Grant                     KGRANT                    011.44.1644.429263   2015-05-24 00:00:00 SA_REP           7000            .15        149
        200 Jennifer             Whalen                    JWHALEN                   515.123.4444         2011-09-17 00:00:00 AD_ASST          4400                       101            10
        201 Michael              Hartstein                 MHARTSTE                  515.123.5555         2012-02-17 00:00:00 MK_MAN          13000                       100            20
        202 Pat                  Fay                       PFAY                      603.123.6666         2013-08-17 00:00:00 MK_REP           6000                       201            20
        205 Shelley              Higgins                   SHIGGINS                  515.123.8080         2010-06-07 00:00:00 AC_MGR          12008                       101           110
        206 William              Gietz                     WGIETZ                    515.123.8181         2010-06-07 00:00:00 AC_ACCOUNT       9000                       205           110

20 rows selected.

hr@ORCLPDB> select * from DEPARTMENTS;

DEPARTMENT_ID DEPARTMENT_NAME                MANAGER_ID LOCATION_ID
------------- ------------------------------ ---------- -----------
           10 Administration                        200        1700
           20 Marketing                             201        1800
           50 Shipping                              124        1500
           60 IT                                    103        1400
           80 Sales                                 149        2500
           90 Executive                             100        1700
          110 Accounting                            205        1700
          190 Contracting                                      1700

8 rows selected.

hr@ORCLPDB> select constraint_name,constraint_type,status from user_constraints where table_name='EMPLOYEES';

CONSTRAINT_NAME                                                                                                                  C STATUS
-------------------------------------------------------------------------------------------------------------------------------- - --------
EMP_MANAGER_FK                                                                                                                   R ENABLED
EMP_DEPT_FK                                                                                                                      R ENABLED
EMP_JOB_FK                                                                                                                       R ENABLED
EMP_LAST_NAME_NN                                                                                                                 C ENABLED
EMP_EMAIL_NN                                                                                                                     C ENABLED
EMP_HIRE_DATE_NN                                                                                                                 C ENABLED
EMP_JOB_NN                                                                                                                       C ENABLED
EMP_SALARY_MIN                                                                                                                   C ENABLED
EMP_EMP_ID_PK                                                                                                                    P ENABLED
EMP_EMAIL_UK                                                                                                                     U ENABLED

10 rows selected.

hr@ORCLPDB> desc EMPLOYEES
 Name                                                                                                              Null?    Type
 ----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
 EMPLOYEE_ID                                                                                                       NOT NULL NUMBER(6)
 FIRST_NAME                                                                                                                 VARCHAR2(20)
 LAST_NAME                                                                                                         NOT NULL VARCHAR2(25)
 EMAIL                                                                                                             NOT NULL VARCHAR2(25)
 PHONE_NUMBER                                                                                                               VARCHAR2(20)
 HIRE_DATE                                                                                                         NOT NULL DATE
 JOB_ID                                                                                                            NOT NULL VARCHAR2(10)
 SALARY                                                                                                                     NUMBER(8,2)
 COMMISSION_PCT                                                                                                             NUMBER(2,2)
 MANAGER_ID                                                                                                                 NUMBER(6)
 DEPARTMENT_ID                                                                                                              NUMBER(4)

hr@ORCLPDB> select dbms_metadata.get_ddl('TABLE','EMPLOYEES','HR') from dual;

DBMS_METADATA.GET_DDL('TABLE','EMPLOYEES','HR')
--------------------------------------------------------------------------------

  CREATE TABLE "HR"."EMPLOYEES"
   (    "EMPLOYEE_ID" NUMBER(6,0),
        "FIRST_NAME" VARCHAR2(20),
        "LAST_NAME" VARCHAR2(25) CONSTRAINT "EMP_LAST_NAME_NN" NOT NULL ENABLE,
        "EMAIL" VARCHAR2(25) CONSTRAINT "EMP_EMAIL_NN" NOT NULL ENABLE,
        "PHONE_NUMBER" VARCHAR2(20),
        "HIRE_DATE" DATE CONSTRAINT "EMP_HIRE_DATE_NN" NOT NULL ENABLE,
        "JOB_ID" VARCHAR2(10) CONSTRAINT "EMP_JOB_NN" NOT NULL ENABLE,
        "SALARY" NUMBER(8,2),
        "COMMISSION_PCT" NUMBER(2,2),
        "MANAGER_ID" NUMBER(6,0),
        "DEPARTMENT_ID" NUMBER(4,0),
         CONSTRAINT "EMP_SALARY_MIN" CHECK (salary > 0) ENABLE,
         CONSTRAINT "EMP_EMAIL_UK" UNIQUE ("EMAIL")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS
 255 COMPUTE STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS
 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE,
         CONSTRAINT "EMP_MANAGER_FK" FOREIGN KEY ("MANAGER_ID") REFERENCES "HR"."EMPLOYEES" ("EMPLOYEE_ID") ENABLE,
         CONSTRAINT "EMP_DEPT_FK" FOREIGN KEY ("DEPARTMENT_ID") REFERENCES "HR"."DEPARTMENTS" ("DEPARTMENT_ID") ENABLE,
         CONSTRAINT "EMP_JOB_FK" FOREIGN KEY ("JOB_ID") REFERENCES "HR"."JOBS" ("JOB_ID") ENABLE
   ) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAX
EXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"
  CREATE UNIQUE INDEX "HR"."EMP_EMP_ID_PK" ON "HR"."EMPLOYEES" ("EMPLOYEE_ID")
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"
ALTER TABLE "HR"."EMPLOYEES" ADD CONSTRAINT "EMP_EMP_ID_PK" PRIMARY KEY ("EMPLOYEE_ID") USING INDEX "HR"."EMP_EMP_ID_PK"  ENABLE

hr@ORCLPDB> select dbms_metadata.get_ddl('TABLE','JOB_HISTORY','HR') from dual;

DBMS_METADATA.GET_DDL('TABLE','JOB_HISTORY','HR')
--------------------------------------------------------------------------------

  CREATE TABLE "HR"."JOB_HISTORY"
   (    "EMPLOYEE_ID" NUMBER(6,0) CONSTRAINT "JHIST_EMPLOYEE_NN" NOT NULL ENABLE,
        "START_DATE" DATE CONSTRAINT "JHIST_START_DATE_NN" NOT NULL ENABLE,
        "END_DATE" DATE CONSTRAINT "JHIST_END_DATE_NN" NOT NULL ENABLE,
        "JOB_ID" VARCHAR2(10) CONSTRAINT "JHIST_JOB_NN" NOT NULL ENABLE,
        "DEPARTMENT_ID" NUMBER(4,0),
         CONSTRAINT "JHIST_DATE_INTERVAL" CHECK (end_date > start_date) ENABLE,
         CONSTRAINT "JHIST_JOB_FK" FOREIGN KEY ("JOB_ID") REFERENCES "HR"."JOBS" ("JOB_ID") ENABLE,
         CONSTRAINT "JHIST_DEPT_FK" FOREIGN KEY ("DEPARTMENT_ID") REFERENCES "HR"."DEPARTMENTS" ("DEPARTMENT_ID") ENABLE,
         CONSTRAINT "JHIST_EMP_FK" FOREIGN KEY ("EMPLOYEE_ID") REFERENCES "HR"."EMPLOYEES" ("EMPLOYEE_ID") DISABLE
   ) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS
 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FL
ASH_CACHE DEFAULT)
  TABLESPACE "USERS"
  CREATE UNIQUE INDEX "HR"."JHIST_EMP_ID_ST_DATE_PK" ON "HR"."JOB_HISTORY" ("EMPLOYEE_ID", "START_DATE")
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTI
CS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXT
ENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS
1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"
ALTER TABLE "HR"."JOB_HISTORY" ADD CONSTRAINT "JHIST_EMP_ID_ST_DATE_PK" PRIMARY KEY ("EMPLOYEE_ID", "START_DATE") USING INDEX "HR"."JHIST_EMP_ID_ST_DATE_PK"  ENABLE

hr@ORCLPDB> select dbms_metadata.get_ddl('TABLE','DEPARTMENTS','HR') from dual;

DBMS_METADATA.GET_DDL('TABLE','DEPARTMENTS','HR')
--------------------------------------------------------------------------------

  CREATE TABLE "HR"."DEPARTMENTS"
   (    "DEPARTMENT_ID" NUMBER(4,0),
        "DEPARTMENT_NAME" VARCHAR2(30) CONSTRAINT "DEPT_NAME_NN" NOT NULL ENABLE,
        "MANAGER_ID" NUMBER(6,0),
        "LOCATION_ID" NUMBER(4,0),
         CONSTRAINT "DEPT_LOC_FK" FOREIGN KEY ("LOCATION_ID") REFERENCES "HR"."LOCATIONS" ("LOCATION_ID") ENABLE,
         CONSTRAINT "DEPT_MGR_FK" FOREIGN KEY ("MANAGER_ID") REFERENCES "HR"."EMPLOYEES" ("EMPLOYEE_ID") DISABLE
   ) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"
  CREATE UNIQUE INDEX "HR"."DEPT_ID_PK" ON "HR"."DEPARTMENTS" ("DEPARTMENT_ID")
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE
STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS
1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLA
SH_CACHE DEFAULT)
  TABLESPACE "USERS"
ALTER TABLE "HR"."DEPARTMENTS" ADD CONSTRAINT "DEPT_ID_PK" PRIMARY KEY ("DEPARTMENT_ID") USING INDEX "HR"."DEPT_ID_PK"  ENABLE

hr@ORCLPDB> select * from jobs;

JOB_ID     JOB_TITLE                           MIN_SALARY MAX_SALARY
---------- ----------------------------------- ---------- ----------
AD_PRES    President                                20080      40000
AD_VP      Administration Vice President            15000      30000
AD_ASST    Administration Assistant                  3000       6000
FI_MGR     Finance Manager                           8200      16000
FI_ACCOUNT Accountant                                4200       9000
AC_MGR     Accounting Manager                        8200      16000
AC_ACCOUNT Public Accountant                         4200       9000
SA_MAN     Sales Manager                            10000      20080
SA_REP     Sales Representative                      6000      12008
PU_MAN     Purchasing Manager                        8000      15000
PU_CLERK   Purchasing Clerk                          2500       5500
ST_MAN     Stock Manager                             5500       8500
ST_CLERK   Stock Clerk                               2008       5000
SH_CLERK   Shipping Clerk                            2500       5500
IT_PROG    Programmer                                4000      10000
MK_MAN     Marketing Manager                         9000      15000
MK_REP     Marketing Representative                  4000       9000
HR_REP     Human Resources Representative            4000       9000
PR_REP     Public Relations Representative           4500      10500

19 rows selected.

hr@ORCLPDB> select * from dba_cons_columns where table_name='EMPLOYEES' order by CONSTRAINT_NAME;

OWNER                CONSTRAINT_NAME                TABLE_NAME                     COLUMN_NAME            POSITION
-------------------- ------------------------------ ------------------------------ -------------------- ----------
HR                   EMP_DEPT_FK                    EMPLOYEES                      DEPARTMENT_ID                 1
HR                   EMP_EMAIL_NN                   EMPLOYEES                      EMAIL
HR                   EMP_EMAIL_UK                   EMPLOYEES                      EMAIL                         1
HR                   EMP_EMP_ID_PK                  EMPLOYEES                      EMPLOYEE_ID                   1
HR                   EMP_HIRE_DATE_NN               EMPLOYEES                      HIRE_DATE
HR                   EMP_JOB_FK                     EMPLOYEES                      JOB_ID                        1
HR                   EMP_JOB_NN                     EMPLOYEES                      JOB_ID
HR                   EMP_LAST_NAME_NN               EMPLOYEES                      LAST_NAME
HR                   EMP_MANAGER_FK                 EMPLOYEES                      MANAGER_ID                    1
HR                   EMP_SALARY_MIN                 EMPLOYEES                      SALARY

10 rows selected.

hr@ORCLPDB> select * from dba_cons_columns where table_name='JOB_HISTORY' order by CONSTRAINT_NAME;

OWNER                CONSTRAINT_NAME                TABLE_NAME                     COLUMN_NAME            POSITION
-------------------- ------------------------------ ------------------------------ -------------------- ----------
HR                   JHIST_DATE_INTERVAL            JOB_HISTORY                    END_DATE
HR                   JHIST_DATE_INTERVAL            JOB_HISTORY                    START_DATE
HR                   JHIST_DEPT_FK                  JOB_HISTORY                    DEPARTMENT_ID                 1
HR                   JHIST_EMPLOYEE_NN              JOB_HISTORY                    EMPLOYEE_ID
HR                   JHIST_EMP_FK                   JOB_HISTORY                    EMPLOYEE_ID                   1
HR                   JHIST_EMP_ID_ST_DATE_PK        JOB_HISTORY                    EMPLOYEE_ID                   1
HR                   JHIST_EMP_ID_ST_DATE_PK        JOB_HISTORY                    START_DATE                    2
HR                   JHIST_END_DATE_NN              JOB_HISTORY                    END_DATE
HR                   JHIST_JOB_FK                   JOB_HISTORY                    JOB_ID                        1
HR                   JHIST_JOB_NN                   JOB_HISTORY                    JOB_ID
HR                   JHIST_START_DATE_NN            JOB_HISTORY                    START_DATE

11 rows selected.

hr@ORCLPDB> select * from dba_cons_columns where table_name='DEPARTMENTS' order by CONSTRAINT_NAME;

OWNER                CONSTRAINT_NAME                TABLE_NAME                     COLUMN_NAME            POSITION
-------------------- ------------------------------ ------------------------------ -------------------- ----------
HR                   DEPT_ID_PK                     DEPARTMENTS                    DEPARTMENT_ID                 1
HR                   DEPT_LOC_FK                    DEPARTMENTS                    LOCATION_ID                   1
HR                   DEPT_MGR_FK                    DEPARTMENTS                    MANAGER_ID                    1
HR                   DEPT_NAME_NN                   DEPARTMENTS                    DEPARTMENT_NAME

2、查询结果
col 主表名 for a30
col 主表列名 for a30
col 外键表名 for a30
col 外键名 for a30
set line 200
SELECT a.table_name      AS 主表名,
       a.column_name     AS 主表列名,
       c.table_name      AS 外键表名,
       c.constraint_name AS 外键名
  FROM all_cons_columns a
  JOIN all_constraints b
    ON a.constraint_name = b.constraint_name
   AND a.owner = b.owner
  JOIN all_constraints c
    ON b.constraint_name = c.r_constraint_name
   AND b.owner = c.r_owner
 WHERE b.constraint_type = 'P'
   AND a.table_name = '&tabname'
Enter value for tabname: EMPLOYEES
old  13:    AND a.table_name = '&tabname'
new  13:    AND a.table_name = 'EMPLOYEES'

主表名                         主表列名                       外键表名                       外键名
------------------------------ ------------------------------ ------------------------------ ------------------------------
EMPLOYEES                      EMPLOYEE_ID                    EMPLOYEES                      EMP_MANAGER_FK
EMPLOYEES                      EMPLOYEE_ID                    JOB_HISTORY                    JHIST_EMP_FK
EMPLOYEES                      EMPLOYEE_ID                    DEPARTMENTS                    DEPT_MGR_FK

SELECT a.table_name      AS 主表名,
       a.column_name     AS 主表列名,
       c.table_name      AS 外键表名,
       c.constraint_name AS 外键名
  FROM user_cons_columns a
  JOIN user_constraints b
    ON a.constraint_name = b.constraint_name
  JOIN user_constraints c
    ON b.constraint_name = c.r_constraint_name
 WHERE b.constraint_type = 'P'
   AND a.table_name = 'EMPLOYEES';

主表名                         主表列名                       外键表名                       外键名
------------------------------ ------------------------------ ------------------------------ ------------------------------
EMPLOYEES                      EMPLOYEE_ID                    JOB_HISTORY                    JHIST_EMP_FK
EMPLOYEES                      EMPLOYEE_ID                    EMPLOYEES                      EMP_MANAGER_FK
EMPLOYEES                      EMPLOYEE_ID                    DEPARTMENTS                    DEPT_MGR_FK

二、oracle中如何查询一张表引用哪些表的约束作为其外键约束.
col 外键表名 for a30
col 外键列名 for a30
col 被引用表名 for a30
col 被引用列名 for a30
col 外键约束名 for a30
set line 200
SELECT c1.table_name     AS 外键表名,
       c1.column_name    AS 外键列名,
	   a.constraint_name AS 外键约束名,
       c2.table_name     AS 被引用表名,
       c2.column_name    AS 被引用列名
  FROM all_cons_columns c1
  JOIN all_constraints a
    ON c1.constraint_name = a.constraint_name
   AND c1.owner = a.owner
  JOIN all_cons_columns c2
    ON a.r_constraint_name = c2.constraint_name
   AND a.r_owner = c2.owner
 WHERE a.constraint_type = 'R'
   AND c1.table_name = UPPER('&tabname')
 order by 2;

外键表名                       外键列名                       外键约束名                     被引用表名                     被引用列名
------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------
EMPLOYEES                      DEPARTMENT_ID                  EMP_DEPT_FK                    DEPARTMENTS                    DEPARTMENT_ID
EMPLOYEES                      JOB_ID                         EMP_JOB_FK                     JOBS                           JOB_ID
EMPLOYEES                      MANAGER_ID                     EMP_MANAGER_FK                 EMPLOYEES                      EMPLOYEE_ID

SELECT c1.table_name     AS 外键表名,
       c1.column_name    AS 外键列名,
       c2.table_name     AS 被引用表名,
       c2.column_name    AS 被引用列名,
       a.constraint_name AS 外键约束名
  FROM user_cons_columns c1
  JOIN user_constraints a
    ON c1.constraint_name = a.constraint_name
  JOIN user_cons_columns c2
    ON a.r_constraint_name = c2.constraint_name
 WHERE a.constraint_type = 'R'
   AND c1.table_name = '&tabname'
 order by 2;
   
Enter value for tabname: EMPLOYEES
old  12:    AND c1.table_name = '&tabname'
new  12:    AND c1.table_name = 'EMPLOYEES'

外键表名                       外键列名                       被引用表名                     被引用列名                     外键约束名
------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------
EMPLOYEES                      DEPARTMENT_ID                  DEPARTMENTS                    DEPARTMENT_ID                  EMP_DEPT_FK
EMPLOYEES                      JOB_ID                         JOBS                           JOB_ID                         EMP_JOB_FK
EMPLOYEES                      MANAGER_ID                     EMPLOYEES                      EMPLOYEE_ID                    EMP_MANAGER_FK

精彩评论(0)

0 0 举报