Первичный ключ с двумя столбцами в Oracle?

У меня есть таблицы с emp1 и emp2

emp1:

emp_1 | emp_2
1     | 2
3     | 4
5     | 6

emp2:

emp
1
2
3
6

Я попытался установить первичный ключ для таблицы emp1 и внешний ключ для emp2.

Мой код:

Для первичного ключа:

alter table emp1 add primary key(emp_1,emp_2);

Для внешнего ключа:

alter table emp2
add foreign key (emp)
references a_t1(emp_1,emp_2);

Ошибка:

Error report -
SQL Error: ORA-02256: number of referencing columns must match referenced       columns
02256. 00000 -  "number of referencing columns must match referenced columns"
*Cause:    The number of columns in the foreign-key referencing list is not
       equal to the number of columns in the referenced list.
*Action:   Make sure that the referencing columns match the referenced
       columns.

Пожалуйста, помогите мне решить эту ошибку и установить первичный ключ.


person user5505661    schedule 30.03.2016    source источник
comment
Вы пытаетесь добавить внешний ключ из одного поля в два поля; вам нужно решить, должны ли значения в таблице EMP2 совпадать с записями в столбце emp_1 ИЛИ emp_2 из таблицы EMP1.   -  person Aleksej    schedule 30.03.2016
comment
У вас не может быть FK, относящийся к части составного PK или к одному из двух отдельных ключей (PK или UK). Что вы ожидаете, если, скажем, у вас есть строки в emp1 со значениями (7,8) и значениями (8,9) и вам нужна строка в emp2 со значением (8)? К какой строке родительского элемента это относится?   -  person Alex Poole    schedule 30.03.2016
comment
да я понял. Я пытался сделать составной первичный ключ.   -  person user5505661    schedule 30.03.2016


Ответы (1)


Единственный способ, который я могу придумать, - это неприятный хак, связанный с материализованным представлением. Было бы лучше исправить ваши данные, чтобы у вас не было распределения первичного ключа по двум столбцам.

CREATE TABLE EMP1 (
  EMP_1 INT UNIQUE,
  EMP_2 INT UNIQUE,
  PRIMARY KEY ( EMP_1,EMP_2 )
);

CREATE MATERIALIZED VIEW LOG ON EMP1
   WITH SEQUENCE, ROWID(EMP_1, EMP_2)
   INCLUDING NEW VALUES;

CREATE MATERIALIZED VIEW EMP1_MV
   BUILD IMMEDIATE
   REFRESH FAST ON COMMIT
   AS SELECT EMP_1 AS EMP
      FROM   EMP1
      UNION ALL
      SELECT EMP_2
      FROM   EMP1;

ALTER TABLE EMP1_MV ADD CONSTRAINT EMP1_MV__PK PRIMARY KEY ( EMP );

CREATE TABLE EMP2 (
  EMP INT PRIMARY KEY REFERENCES EMP1_MV( EMP )
);
person MT0    schedule 30.03.2016
comment
Спасибо. Я получил концепцию. Попробую с материализованным представлением. - person user5505661; 30.03.2016