Oracle (ORA-02270): нет соответствующего уникального или первичного ключа для этой ошибки в столбце

У меня есть две таблицы, Table JOB и Table USER, вот структура

 CREATE TABLE JOB
 (
   ID       NUMBER NOT NULL ,
   USERID   NUMBER,
   CONSTRAINT B_PK PRIMARY KEY ( ID ) ENABLE
 );

 CREATE TABLE USER
 (
   ID       NUMBER NOT NULL ,
   CONSTRAINT U_PK PRIMARY KEY ( ID ) ENABLE
 );

Теперь я хочу добавить ограничение внешнего ключа в JOB ссылающееся на таблицу USER, так как

Alter Table JOB ADD CONSTRAINT FK_USERID FOREIGN KEY(USERID) REFERENCES USER(ID);

это Oracle (ORA-02270): no matching unique or primary key for this column-list error, при проведении некоторого исследования выясняется, что нам нужно иметь ограничение unique key or primary key для USERID но я не могу этого сделать, так как один USERID может есть несколько JOBS, связанные с ним, любыми мыслями или предложениями о том, как решить эту проблему?

Исследовал вопрос, связанный с ORA-02270 и SO

Ответ 1

Ошибка ORA-2270 - это простая логическая ошибка: она возникает, когда столбцы, которые мы перечисляем во внешнем ключе, не соответствуют первичному ключу или уникальному ограничению родительской таблицы. Распространенные причины этого:

  • у родителя вообще нет ограничения PRIMARY KEY или UNIQUE
  • предложение внешнего ключа ссылается на неправильный столбец в родительской таблице
  • ограничение родительской таблицы является составным ключом, и мы не ссылались на все столбцы в выражении внешнего ключа.

Ни один из них, похоже, не относится к вашему опубликованному коду Но это красная сельдь, потому что ваш код не запускается так, как вы его опубликовали. Судя по предыдущим изменениям, я полагаю, что вы публикуете не реальный код, а упрощенный пример. К сожалению, в процессе упрощения вы устранили все, что вызывает ошибку ORA-2270.

SQL> CREATE TABLE JOB
 (
   ID       NUMBER NOT NULL ,
   USERID   NUMBER,
   CONSTRAINT B_PK PRIMARY KEY ( ID ) ENABLE
 );  2    3    4    5    6  

Table created.

SQL> CREATE TABLE USER
 (
   ID       NUMBER NOT NULL ,
   CONSTRAINT U_PK PRIMARY KEY ( ID ) ENABLE
 );  2    3    4    5  
CREATE TABLE USER
             *
ERROR at line 1:
ORA-00903: invalid table name


SQL> 

Это утверждение не выполнено, поскольку USER является зарезервированным ключевым словом, поэтому мы не можем назвать таблицу USER. Давайте исправим это:

SQL> 1
  1* CREATE TABLE USER
SQL> a s
  1* CREATE TABLE USERs
SQL> l
  1  CREATE TABLE USERs
  2   (
  3     ID       NUMBER NOT NULL ,
  4     CONSTRAINT U_PK PRIMARY KEY ( ID ) ENABLE
  5*  )
SQL> r
  1  CREATE TABLE USERs
  2   (
  3     ID       NUMBER NOT NULL ,
  4     CONSTRAINT U_PK PRIMARY KEY ( ID ) ENABLE
  5*  )

Table created.

SQL> Alter Table JOB ADD CONSTRAINT FK_USERID FOREIGN KEY(USERID) REFERENCES USERS(ID);   

Table altered.

SQL> 

И вот! Нет ошибки ORA-2270.

Увы, мы мало что можем сделать, чтобы помочь вам в дальнейшем. У вас есть ошибка в вашем коде. Вы можете разместить свой код здесь, и один из нас может определить вашу ошибку. Или вы можете проверить свой собственный код и открыть его для себя.


Примечание: более ранняя версия кода определяла HOB.USERID как VARCHAR2 (20). Поскольку USER.ID определен как NUMBER, попытка создания внешнего ключа приведет к другой ошибке:

ORA-02267: тип столбца несовместим со ссылочным типом столбца

Самый простой способ избежать несоответствий - использовать синтаксис внешнего ключа для определения типа данных столбца по умолчанию:

CREATE TABLE USERs
 (
   ID    number NOT NULL ,
   CONSTRAINT U_PK PRIMARY KEY ( ID ) ENABLE
 );

CREATE TABLE JOB
 (
   ID       NUMBER NOT NULL ,
   USERID   constraint FK_USERID references users,
   CONSTRAINT B_PK PRIMARY KEY ( ID ) ENABLE
 );

Ответ 2

Тип данных в таблице Job (Varchar2 (20)) не соответствует типу данных в таблице USER (NUMBER NOT NULL).

Ответ 3

Схема правильная, User.ID должен быть первичным ключом User, Job.ID должен быть основным ключом Job и Job.UserID должен быть внешним ключом к User.ID. Кроме того, ваши команды выглядят синтаксически правильными.

Так что может быть неправильно? Я считаю, что у вас есть хотя бы Job.UserID, у которого нет пары в User.ID. Например, если все значения User.ID: 1,2,3,4,6,7,8, и у вас есть значение Job.UserID 5 (что не относится к 1,2,3,4,6, 7,8, которые являются возможными значениями UserID), вы не сможете создать ограничение внешнего ключа. Решение:

delete from Job where UserID in (select distinct User.ID from User);

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

Ответ 4

Наиболее вероятно, что если у вас отсутствует основной ключ, он не определен из родительской таблицы. то это происходит.

Как добавить определение первичного ключа в родительском, как показано ниже:

ALTER TABLE "FE_PRODUCT" ADD CONSTRAINT "FE_PRODUCT_PK" PRIMARY KEY ("ID") ENABLE;

Надеюсь, что это сработает.

Ответ 5

В моем случае проблема была вызвана отключенным PK.

Чтобы включить его:

  • Я ищу имя Constraint с помощью:

    SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME = 'referenced_table_name';

  • Затем я взял имя Constraint, чтобы включить его с помощью следующей команды:

    ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;

Ответ 6

В моем сценарии я столкнулся с той же проблемой:

Я создал таблицу учебника сначала с

create table textbook(txtbk_isbn varchar2(13)
primary key,txtbk_title varchar2(40),
txtbk_author varchar2(40) );

Затем таблица глав:

create table chapter(txtbk_isbn varchar2(13),chapter_title varchar2(40), constraint pk_chapter primary key(txtbk_isbn,chapter_title), constraint chapter_txtbook foreign key (txtbk_isbn) references textbook (txtbk_isbn));

Тогда тема таблицы:

create table topic(topic_id varchar2(20) primary key,topic_name varchar2(40));

Теперь, когда я хотел создать взаимосвязь с именем chapter_topic между chapter (имеющим составной первичный ключ) и topic (имеющим первичный ключ из одного столбца), я столкнулся с проблемой следующего запроса:

create table chapter_topic(txtbk_isbn varchar2(13),chapter_title varchar2(40),topic_id varchar2(20), primary key (txtbk_isbn, chapter_title, topic_id), foreign key (txtbk_isbn) references textbook(txtbk_isbn), foreign key (chapter_title) references chapter(chapter_title), foreign key (topic_id) references topic (topic_id));

Решение состояло в том, чтобы сослаться на составной внешний ключ, как показано ниже:

create table chapter_topic(txtbk_isbn varchar2(13),chapter_title varchar2(40),topic_id varchar2(20), primary key (txtbk_isbn, chapter_title, topic_id), foreign key (txtbk_isbn, chapter_title) references chapter(txtbk_isbn, chapter_title), foreign key (topic_id) references topic (topic_id));

Благодаря сообщению APC, в котором он упомянул в своем сообщении выражение о том, что:

Общие причины этого
- у родителя вообще нет ограничений
- ограничение родительской таблицы является составным ключом, и мы не ссылались на все столбцы в выражении внешнего ключа.
- указанное ограничение PK существует, но ОТКЛЮЧЕНО

Ответ 7

Разница между вашим выражением USERID проблемы

JOB: UserID is Varchar
USER: UserID is Number?

Ответ 8

Если первичный ключ еще не определен в родительской таблице, эта проблема может возникнуть. Пожалуйста, попробуйте определить первичный ключ в существующей таблице. Например:

ALTER TABLE table_name
ADD PRIMARY KEY (the_column_which_is_primary_key);

Ответ 9

При запуске этой команды:

ALTER TABLE MYTABLENAME MODIFY CONSTRAINT MYCONSTRAINTNAME_FK ENABLE;

Я получил эту ошибку:

ORA-02270: no matching unique or primary key for this column-list
02270. 00000 -  "no matching unique or primary key for this column-list"
*Cause:    A REFERENCES clause in a CREATE/ALTER TABLE statement
          gives a column-list for which there is no matching unique or primary
          key constraint in the referenced table.
*Action:   Find the correct column names using the ALL_CONS_COLUMNS

Ссылочная таблица имеет ограничение первичного ключа с соответствующим типом. Основной причиной этой ошибки, в моем случае, было то, что ограничение первичного ключа было отключено.

Ответ 10

create table articles(code varchar2(30)constraint articles_pk primary key,titre varchar2(30),
support varchar2(30) constraint support_fk references supports(support),type_support varchar2(30),
numeroDePage varchar2(30),datepublication date,categorie varchar2(30)constraint categorie_fk references organismes(categorie),
tendance varchar2(30)constraint tendance_fk references apreciations(tendance));