oracle - 需要用外键和主键填充表
问题描述
我需要从all_tab_col
系统表中创建三个表,以便架构详细信息在一个schema_detail table
表中,表详细信息在table_detail
表中,列详细信息在col_table
。这三个表将通过存储过程同时填充,其中PK(generated using SEQUENCE)
in schema_detail
is FK
in table_detail
table 和PK(generated using SEQUENCE)
in table_detail
is FK
in col_detail table
。
解决方案
SQL 是一种基于集合的语言,因此我很想通过三个集合基础步骤来解决您的任务。
一些模拟表(只需为您感兴趣的详细信息添加列):
CREATE TABLE schema_detail (
schema_id NUMBER GENERATED ALWAYS AS IDENTITY NOT NULL,
schema_name VARCHAR2(128 BYTE) NOT NULL,
CONSTRAINT schema_detail_pk PRIMARY KEY (schema_id)
);
CREATE TABLE table_detail (
schema_id NUMBER,
table_id NUMBER GENERATED ALWAYS AS IDENTITY NOT NULL,
table_name VARCHAR2(128 BYTE) NOT NULL,
CONSTRAINT table_detail_pk PRIMARY KEY (table_id),
CONSTRAINT table_detail_fk FOREIGN KEY (schema_id)
REFERENCES schema_detail(schema_id)
ON DELETE CASCADE
);
CREATE INDEX table_detail_schema_idx ON table_detail(schema_id);
CREATE INDEX table_detail_name_idx ON table_detail(table_name);
CREATE TABLE col_detail (
table_id NUMBER,
col_id NUMBER GENERATED ALWAYS AS IDENTITY NOT NULL,
col_name VARCHAR2(128 BYTE) NOT NULL,
CONSTRAINT col_detail_pk PRIMARY KEY (col_id),
CONSTRAINT col_detail_fk FOREIGN KEY (table_id)
REFERENCES table_detail(table_id)
ON DELETE CASCADE
);
CREATE INDEX col_detail ON col_detail(table_id);
我会schema_detail
先填满桌子。PK是自动生成的:
INSERT INTO schema_detail(schema_name)
SELECT DISTINCT c.owner FROM all_tab_columns c ORDER BY owner;
SCHEMA_ID SCHEMA_NAME
1 APPQOSSYS
2 AUDSYS
3 CTXSYS
...
接下来,我会填写表格。schema_id 需要在schema_detail
表中查找。同样,我们让 PK 自动生成:
INSERT INTO table_detail(schema_id, table_name)
SELECT DISTINCT s.schema_id, c.table_name
FROM all_tab_columns c
JOIN schema_detail s ON c.owner = s.schema_name
ORDER BY table_name;
SCHEMA_ID TABLE_ID TABLE_NAME
1 8403 WLM_CLASSIFIER_PLAN
1 8404 WLM_FEATURE_USAGE
1 8405 WLM_METRICS_STREAM
...
最后,我会填写这些列:
INSERT INTO col_detail(table_id, col_name)
SELECT DISTINCT t.table_id, c.column_name
FROM all_tab_columns c
JOIN table_detail t ON c.table_name = t.table_name
JOIN schema_detail s ON c.owner = s.schema_name
ORDER BY s.schema_id, t.table_id, c.column_name;
这能解决您的问题还是您需要 PL/SQL 过程?
推荐阅读
- sql-server - SQL - 无法在主数据库 sysprocess 中找到/查看当前正在执行的阻塞查询
- redux - Redux 状态和 momentjs
- ruby-on-rails - Rails 读取 cookie 返回一个字符串而不是一个对象
- c# - ProcessStartInfo 从 lpr 命令得到空的 StandardError 结果
- icinga2 - Icinga2 icingaWeb2 : 无法将窗口主机注册到 Centos 主机,但在其他 Centos 服务器上没有问题
- image - Safari、Chrome 和 Firefox 中的不同图像渲染
- ios - 替换Realm数据库文件并使新数据库对watchOS生效
- c# - 无法通过 XElement 创建名称中带有冒号的 XML 标记
- swiper - 在新版本的 Swiper Slider 中设置两个滑块之间的连接
- eclipse - 这个图标在 Eclipse Project Explorer 中是什么意思(带有向上箭头的数字)?