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