【问题标题】:How can I limit 'insert into' based on a foreign key value?如何根据外键值限制“插入”?
【发布时间】:2020-09-07 20:43:42
【问题描述】:

我有两张桌子;

tbl_ride

+---------+--------------+----------+
| rideID  |   rideName   | duration |
+---------+--------------+----------+
|   1     |    NY Tour   |     3    |
|   2     | Night Life   |     2    |
+---------+--------------+----------+

tbl_day

+------------+-----------+----------+
| dayID      |   rideID  | routeMap |
+---------+--------------+----------+
|   1        |     1     |   A-B    |
|   2        |     1     |   B-C    |
|   3        |     1     |   C-D    |
|   4        |     2     |   A-B    |
|   5        |     2     |   B-C    |
+---------+--------------+----------+

所以我需要能够根据tbl_ride.duration 限制记录到tbl_day 的记录数。这可以通过 SQL 来实现还是应该通过代码来实现?无论哪种方式,我都将不胜感激。

以下是我当前用于 JDBC 的 MySQL 代码:

INSERT INTO `tbl_tour_day` (`tourID`, `startHotel`, `endHotel`, `routeNote`, `routeMap`) 
VALUES ( (SELECT tourID from tbl_tour_ride where tbl_tour_ride.tourID = ?), ?, ?, ?, ?)

【问题讨论】:

  • 所以你每天只能有8个ride_id = 1个?
  • 如果达到某些rideIDtbl_ride.duration 记录数量,则此rideID 的下一条记录必须是:1) 忽略2) 弹出错误3) 插入而不是一些现有的(最古老的?)记录 4)别的东西。并显示 FULL tbl_day 的 DDL。
  • @Akina 如果某些rideID 的`tbl_ride.duration value` 为2,那么用户应该只能在tbl_day 中为外键rideID 添加2 条记录。如果达到特定rideIDtbl_day 的最大值,则会出现错误提示“已指定此行程的所有日期”
  • @P.Salmon 您的问题不清楚。你能详细说明一下吗?
  • 这可以使用 BEFORE INSERT 触发器轻松实现。

标签: java mysql jdbc


【解决方案1】:

测试

CREATE TRIGGER tr_bi_tbl_day
BEFORE INSERT 
ON tbl_day
FOR EACH ROW
BEGIN
IF    COALESCE(( SELECT COUNT(*) FROM tbl_day WHERE rideID = NEW.rideID ), 0)
   >=
      COALESCE(( SELECT MAX(duration) FROM tbl_ride WHERE rideID = NEW.rideID ), 0) THEN
    SIGNAL SQLSTATE = '45000' 
        SET MESSAGE_TEXT = 'All days for this ride has been specified';
END IF;
END

如果tbl_ride 中没有新的rideID 的记录,则不允许插入(假定数量为零)。

如果tbl_ride 中有多个新的rideID 记录,则使用最大值作为限制。

【讨论】:

  • 这是有道理的,它奏效了!。谢谢你。顺便说一句,我对触发器很陌生。我将在哪里看到您定义的错误消息?是否可以在 java 中检索该错误消息?
  • 我在哪里可以看到你定义的错误信息? 这是常见的错误信息。在哪里可以看到有关语法错误、外键违规、数据类型不正确等的错误消息?查询执行期间发生的任何错误。可以通过相同的方式检索此自定义消息。
【解决方案2】:

这是一个有效查询的示例:

INSERT INTO tbl_tour_day 
(tourID
,startHotel
,endHotel
,routeNote
,routeMap
)  
SELECT tourID 
     , ?
     , ?
     , ?
     , ?
  from tbl_tour_ride 
 where tbl_tour_ride.tourID = ?

【讨论】:

  • 这不能回答OP提出的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
相关资源
最近更新 更多