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

Мне нужно создать 2 таблицы. первый

CREATE TABLE orders
( order_id number(10) NOT NULL,
  order_name varchar2(50) NOT NULL,
  payment_id number(10) NOT NULL,
  CONSTRAINT order_id PRIMARY KEY (order_id),
);

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

CREATE TABLE payment
    (
      payments_id number(10) NOT NULL,
      payment_name varchar(50) NOT NULL,
      CONSTRAINT payments_id PRIMARY KEY (payments_id),
      FOREIGN KEY (payments_id) REFERENCES orders(payment_id)
    );

не уверен, что я делаю неправильно

пожалуйста помоги

ССЫЛКИ заказов(payment_id)

astentx 09.05.2022 22:03

Это довольно очевидно - ваш внешний ключ указывает на ("ссылки") столбец в таблице ORDERS, но это не столбец PK этой таблицы. В ORDERS вы объявили ORDER_ID как PK. Предполагается ли, что PAYMENT_ID имеет уникальные (отличающиеся) значения в таблице ORDERS и что на него должна ссылаться вторая таблица? Если это так, вам нужно добавить ограничение UNIQUE для этого столбца в таблице ORDERS.

mathguy 09.05.2022 22:08
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно сослаться на столбец UNIQUE или PRIMARY KEY. Столбец payment_id не имеет ни одного из этих ограничений.

Из Документация по ограничениям Oracle:

Foreign Key Constraints

A foreign key constraint (also called a referential integrity constraint) designates a column as the foreign key and establishes a relationship between that foreign key and a specified primary or unique key, called the referenced key.

Вместо этого вы можете добавить в таблицу столбец order_id:

CREATE TABLE orders(
  order_id   NUMBER(10)   NOT NULL,
  order_name VARCHAR2(50) NOT NULL,
  CONSTRAINT orders__order_id__pk PRIMARY KEY (order_id)
);

CREATE TABLE payment(
  payments_id  NUMBER(10) NOT NULL,
  payment_name VARCHAR2(50) NOT NULL,
  order_id     NOT NULL,
  CONSTRAINT payment__payments_id__pk PRIMARY KEY (payments_id),
  CONSTRAINT payment__order_id__fk    FOREIGN KEY (order_id)
                                      REFERENCES orders (order_id)
);

дб <> рабочий пример здесь

всем спасибо за ответы, я добавил эту строчку в скрипт создания заказов и теперь все заработало CONSTRAINT AK_payment_id UNIQUE (payment_id),

Simo51 09.05.2022 22:18

@ Simo51 Simo51 Это может сработать, но вы должны подумать, имеет ли смысл это делать? Учитывая оба ограничения, вы можете иметь только уникальные order_id, а также только уникальные payment_id в одних и тех же таблицах, поэтому между двумя идентификаторами будет отношение один к одному. В таком случае, почему бы просто не создать один столбец id и использовать его для обоих? Но если у вас может быть несколько платежей за каждый заказ, то это определенно не имеет смысла.

MT0 09.05.2022 22:24

Другие вопросы по теме