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 и так что вопрос

9 ответов


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

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

не представляется случай в вашей разместил код. Но это отвлекающий маневр, потому что ваш код не работает как вы его разместили. Судя по предыдущим изменениям, я предполагаю, что вы не публикуете свой фактический код, а какой-то упрощенный пример. К сожалению, в процессе упрощения вы устранили все, что вызывает ошибку 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 является зарезервированным ключевым словом, и мы не можем имя пользователя таблицы. Давайте исправим это:

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.

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


тип данных в таблице заданий (Varchar2 (20)) не соответствует типу данных в таблице пользователей (число не равно нулю).


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

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

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

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


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

Как добавить первичный ключ в parent, как показано ниже:

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

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


в моем случае проблема была вызвана инвалида ПК.

для того, чтобы включить его:

  1. Я ищу имя ограничения с:

    SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME = 'referenced_table_name';

  2. затем я взял имя ограничения, чтобы включить его со следующей командой:

    ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;


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

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

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 между главой (с составным первичным ключом) и темой (с одним первичным ключом столбца), я столкнулся с проблемой со следующим запросом:

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 существует, но отключено


Не разница между вашим объявлением USERID проблема

JOB: UserID is Varchar
USER: UserID is Number?

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

ALTER TABLE table_name
ADD PRIMARY KEY (the_column_which_is_primary_key);

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));