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;
надеюсь, это сработает.
в моем случае проблема была вызвана инвалида ПК.
для того, чтобы включить его:
-
Я ищу имя ограничения с:
SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME = 'referenced_table_name';
-
затем я взял имя ограничения, чтобы включить его со следующей командой:
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 существует, но отключено
если первичный ключ еще не определен в родительской таблице, эта проблема может возникнуть. Попробуйте определить первичный ключ в существующей таблице. Например:
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));