一、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