将值插入 table

Inserting values into the table

我正在尝试将值插入到我创建的表中。 这是我要插入的值。

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)

您的 table 中有一个独特的约束。您的 table 已有您要插入的包含 customer_idrental_datefilm_title 的记录。

试试这个查询,你会看到已经有一条记录

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

您似乎正试图为同一客户在同一天为同一部电影添加重复的租借活动。如果您在您的业务逻辑中允许这样一种情况,即客户可以租借一部电影,并在同一天归还并再次租回,那么这显然会发生。

了解您的业务,您有 2 种方法来处理这种情况:

  1. 您的商业模式不允许这样做。这意味着这是一条重复记录,您不应添加当前存在的记录,在这种情况下显示该错误是完全正确的并且不允许重复,因为此事件仅发生一次。

  2. 您的商业模式允许这样做。在这种情况下,您应该修改 rental_date 列以存储时间和日期,而不是仅存储日期,以便您知道租赁事件实际发生的时间。例如,您可以使用 datetime 类型来存储日期和时间。这可以在创建 table 时完成,只需将 rental_date date 替换为 rental_date datetime。如果 table 已经创建,您将需要删除并重新创建 PRIMARY KEY,然后您可以使用 ALTER TABLE ddr_rental ALTER COLUMN rental_date datetime 更改列的类型并重新创建主键。之后检查存储在 table 中的值,因为 2019-01-01 现在将表示为 2019-01-01 00:00:00.000 附加之前未指定的时间。

除了 (1) 之外,您还可以包装代码并处理此异常,以便在发生这种情况时 return 显示一条明确的消息,表明电影已被租借。

此外,由于您没有 table 用于在库存中存储电影,因此这可能会导致错误,因为您可能拥有超过 1 部电影的副本。在这种情况下,我建议您创建单独的电影和 film_copy tables 以正确识别已租借的电影副本,以便您可以租用另一份。