【问题标题】:Before insert trigger in mysql giving issue when insert is fired from Java code在从 Java 代码触发插入时,在 mysql 中插入触发器之前给出问题
【发布时间】:2014-02-20 19:22:10
【问题描述】:
DELIMITER $$
CREATE TRIGGER `classdost`.`tr_xyz_media`
BEFORE INSERT ON classdost.xyz_media
FOR EACH ROW
BEGIN
DECLARE t_id INT(20);

IF NEW.id < 5000000 THEN

INSERT INTO xyz_media_temp (insert_date) VALUES(CURDATE());
SELECT MAX(xyz_media_temp.id) INTO t_id FROM xyz_media_temp;

SET New.id = t_id;

END IF;
END$$

DELIMITER ;

我在 MySQL 中有这个触发器,当我在 PHPMyadmin 中触发任何插入查询时,它运行良好,但是当从 java 代码触发相同的插入时,它没有执行。我尝试使用 async: false 将所有请求更改为 Ajax 的代码,然后我发现早期的请求仍在后台运行,而我后来的请求给出了异常,因为尚未从数据库返回 ID。

可以做些什么来避免这个问题?

【问题讨论】:

  • 我建议添加一个date 类型的新insert_date 字段,并将id 字段更改为classdost.xyz_media 表中的自动递增主键。
  • 以这种方式选择 max 有时会与正确的记录不匹配,因为其他人连续插入。
  • 实际上 classdost.xyz_media 的 ID 列只是自动递增的,但要运行此触发器,我们必须更改它。

标签: java mysql triggers


【解决方案1】:

如果您说请求仍在后台运行,那么您的表可能已被锁定(MyISAM 表),您无法对其进行修改。

使用此查询查看表是否被锁定 -

SHOW OPEN TABLES FROM database_name;

此查询将显示打开的表,这些表无法编辑(INSERT、UPDATE 等)。然后检查您的 Java 应用程序,找到锁定表的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 2012-12-11
    • 2022-07-06
    • 1970-01-01
    相关资源
    最近更新 更多