Как я могу выгрузить данные из таблиц с составными PK / FK в аналогичные таблицы, используя ID / FK - PullRequest
0 голосов
/ 07 декабря 2018

Скажем, у меня есть таблица, для которой требуется составной PK:

Table1
+---------+---------+
|  CompA  |  CompB  |
+---------+---------+
| Value 1 | Value 2 |
| Value 1 | Value 3 |
| Value 2 | Value 3 |
+---------+---------+

Затем я построил вторую таблицу и хотел использовать PK из Таблицы 1 в качестве FK в этой новой Таблице 2. Есть дваспособы, которыми вы можете сделать это.

Опция 1 - И вариант, с которого я изначально пошел, - это просто использовать составной ключ из Таблицы 1 в качестве FK в Таблице 2.

Table 2
+------+---------+---------+
| T2PK |  CompA  |  CompB  |
+------+---------+---------+
| A    | Value 1 | Value 2 |
| B    | Value 1 | Value 3 |
| C    | Value 2 | Value 3 |
| D    | Value 2 | Value 3 |
+------+---------+---------+

Вариант 2 - вариант, к которому я теперь хочу перейти, состоит в том, чтобы изменить PK в таблице 1 на столбец ID и установить составное УНИКАЛЬНОЕ ограничение на пары значений

Table 1
+----+---------+---------+
| ID |  CompA  |  CompB  |
+----+---------+---------+
|  1 | Value 1 | Value 2 |
|  2 | Value 1 | Value 3 |
|  3 | Value 2 | Value 3 |
+----+---------+---------+

Так что теперьв любых других таблицах, в которых вы хотите использовать Таблицу 1 в качестве FK, вы ссылаетесь на один столбец идентификатора (поскольку это теперь PK таблицы 1)

Table 2
+----+------+
| PK | T1FK |
+----+------+
| A  |    1 |
| B  |    2 |
| C  |    3 |
| D  |    3 |
+----+------+

Проблема - IИзначально мои таблицы создавались с помощью Варианта 1. Наличие FK, которые охватывают несколько столбцов для 1 объекта, стало раздражающим и делает мои операторы объединения более сложными, чем они должны быть.Теперь я хочу перейти к варианту 2. Я построил таблицы с методологией варианта 2, но я не могу найти хороший способ выгрузить данные моей таблицы варианта 1 в мои новые таблицы варианта 2.Я не могу понять, как, после сброса данных Table1, Option1 в таблицу Table1 Option2 и получения сгенерированных идентификаторов, как связать эти сгенерированные идентификаторы с тем же набором данных Table2 Option1 с новым Table2 Option2

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Предполагая, что у нас есть эти "старые" таблицы:

CREATE TABLE Table1(
  CompA varchar2(10), CompB  varchar2(10), constraint Table1_pk primary key(CompA,CompB)
);

Insert all
into Table1 values('Value 1', 'Value 2')
into Table1 values('Value 1', 'Value 3')
into Table1 values('Value 2', 'Value 3')
SELECT null FROM dual;

CREATE TABLE Table2(
  T2PK varchar2(1),
  CompA varchar2(10), CompB  varchar2(10), 
  constraint Table2_fk foreign key(CompA,CompB) references table1(CompA,CompB)
);

Insert all
into Table2 values('A', 'Value 1', 'Value 2')
into Table2 values('B', 'Value 1', 'Value 3')
into Table2 values('C', 'Value 2', 'Value 3')
into Table2 values('D', 'Value 2', 'Value 3')
SELECT null FROM dual;

мы можем перейти на "новые" таблицы, используя следующий код:

CREATE TABLE new_Table1(
   ID int PRIMARY KEY,
   CompA varchar2(10), CompB  varchar2(10), 
   constraint new_Table1_uq unique(CompA,CompB)
);

INSERT INTO new_Table1( id, CompA, CompB)
SELECT rownum, CompA, CompB FROM Table1;

CREATE TABLE new_Table2(
   PK  varchar2(1),
   T1FK int,
   constraint new_Table2_fk foreign key(T1FK) references new_Table1( id )
);

INSERT INTO new_Table2( PK , T1FK )
SELECT t2.T2PK, t1.ID
FROM Table2 t2
JOIN new_Table1 t1 
ON t2.CompA = t1.CompA AND t2.CompB = t1.CompB;

Вот рабочая демонстрация: https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=32e852ab929c9431cce31495745ec6ba

0 голосов
/ 07 декабря 2018

Ну, вы можете назначить идентификатор, используя row_number() или rownum:

create table new_table1 as
    select rownum as table1_id, compA, compB
    from table1;

Затем вы можете использовать это как:

create table new_table2 as
    select t2.id, t2.table1_id
    from table2 t2 left join  -- outer join just in case you have NULL values
         new_table1 t1
         on t2.compA = t1.compA and t2.compB = t1.compB;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...