Вставка значений в таблицу - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь вставить значения в таблицы, которые я создал. Это значения, которые я пытаюсь вставить.

INSERT INTO DDR_Rental (customer_ID, rental_date, rent_fee, film_title, start_date, expiry_date, rating)
VALUES (12345, '12-Mar-19', '4.99', 'Peppermint', '12-Mar-19', '22-Mar-19', 4);

Это типы данных и ограничения.

CREATE TABLE DDR_Rental
 (customer_ID NUMBER(5),
  rental_date DATE,
  rent_fee NUMBER(3,2) CONSTRAINT SYS_RENTAL_FEE_NN NOT NULL,
  film_title VARCHAR2(20),
  start_date DATE,
  expiry_date DATE,
  rating NUMBER(5),
  CONSTRAINT SYS_RENTAL_PK PRIMARY KEY ((customer_ID), (rental_date), (film_title)),
  CONSTRAINT SYS_RENTAL_CUS_ID_FK1 FOREIGN KEY (customer_ID) REFERENCES 
     DDR_CUSTOMER(CUSTOMER_ID),
  CONSTRAINT SYS_RENTAL_FILM_TITLE_FK2 FOREIGN KEY (film_title) REFERENCES
     DDR_MOVIE_TITLE(FILM_TITLE),
  CONSTRAINT SYS_RENTAL_EXP_DATE_CK CHECK (expiry_date >= start_date),
  CONSTRAINT SYS_RENTAL_START_DATE_CK CHECK (start_date >= rental_date),
  CONSTRAINT SYS_RENTAL_RATING_CK CHECK (REGEXP_LIKE(rating,('[12345]'))));

Ошибка говорит о уникальное ограничение (CPRG250.SYS_RENTAL_PK) нарушено

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

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

Зная свое дело, у вас есть 2 способа справиться с этой ситуацией:

  1. Ваша бизнес-модель не позволяет этого. Это означает, что это дублирующая запись, и вам не следует добавлять существующую в данный момент запись, в этом случае показывается, что ошибка вполне допустима и не допускает дублирования, поскольку это событие произошло только один раз.

  2. Ваша бизнес-модель позволяет это. В этом случае вам следует изменить столбец rental_date, чтобы хранить время вместе с датой, а не только дату хранения, чтобы вы знали, когда событие проката действительно происходит. Например, вы можете использовать тип datetime для сохранения даты во времени. Это можно сделать при создании таблицы, просто замените rental_date date на rental_date datetime. Если таблица уже создана, вам нужно будет удалить и заново создать PRIMARY KEY, а затем после этого вы можете изменить тип столбца с помощью ALTER TABLE ddr_rental ALTER COLUMN rental_date datetime и заново создать первичный ключ. После этого проверьте значения, хранящиеся в вашей таблице, поскольку 2019-01-01 теперь будет представлено как 2019-01-01 00:00:00.000, добавляя время, которое не было указано ранее.

В дополнение к (1) вы можете обернуть свой код и обработать это исключение, чтобы при возникновении этого события возвращалось четкое сообщение о том, что фильм уже сдан в аренду.

Более того, поскольку у вас нет таблицы для хранения фильмов в вашем инвентаре, это может привести к возможной ошибке, поскольку у вас может быть более 1 копии фильма. В этом случае я предлагаю вам создать отдельные таблицы film и film_copy, чтобы правильно определить, какая копия фильма была взята напрокат, чтобы вы могли арендовать другую копию.

1 голос
/ 22 апреля 2019

У вас есть уникальное ограничение в вашей таблице.В вашей таблице уже есть запись с customer_id, rental_date и film_title, которую вы хотите вставить.

Попробуйте этот запрос, и вы увидите, что запись уже существует

select * from DDR_Rental
where customer_id=12345 and rental_date='12-Mar-19' and film_title='Peppermint'
...