首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL UPDATE Table on INSERT on table

MYSQL UPDATE Table on INSERT on table
EN

Stack Overflow用户
提问于 2020-05-17 17:05:06
回答 2查看 148关注 0票数 1

这看起来很简单,但仍然是一个挑战。我尽可能地简化了我的问题。

我有一个包含一条记录的test_table:

代码语言:javascript
复制
    id | cost_per_record
    1  | 24

在INSERT之后,我希望表看起来像这样:

代码语言:javascript
复制
    id | cost_per_record
    1  | 12
    2  | 12

在我工作的应用程序中,我不能调用存储过程,所以我使用的代码包括:

代码语言:javascript
复制
    DROP TABLE IF EXISTS `test_table`;
    CREATE TABLE `test_table` (
      `id` int(11) NOT NULL,
      `cost_per_record` int(11) DEFAULT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    INSERT INTO `test_table` (`id`, `cost_per_record`) VALUES (1,24);

    DELIMITER $$
    CREATE TRIGGER `test_insert` BEFORE INSERT ON `test_table` FOR EACH ROW 
    BEGIN
    update `test_table` set `cost_per_record` = 12 
    where `id`  = 1;
    END
    $$
    DELIMITER ;

    INSERT INTO `test_table` (`id`, `cost_per_record`) VALUES
    (2,12);

我通常收到的错误(在其他尝试中也是如此):

代码语言:javascript
复制
    MySQL said: Documentation 

    #1442 - Can't update table 'kan_test_update' in stored function/trigger because it is already      used by statement which invoked this stored function/trigger

相信我,我在这个论坛上读到了相当多的答案,还在博客上看到有人说这是impossible。但我(仍然)不接受这一点。所以..。任何解决方案...谢谢..。

EN

回答 2

Stack Overflow用户

发布于 2020-05-17 17:29:37

像下面这样的触发器只能更改当前插入的行。

代码语言:javascript
复制
DELIMITER $$
CREATE TRIGGER `test_insert` BEFORE INSERT ON `test_table` FOR EACH ROW 
BEGIN
IF NEW.`id`  = 1 THEN
    SET NEW.`cost_per_record` = 12;
END IF;
END
$$
DELIMITER ;

要更新其他行并插入,只能使用存储过程。

喜欢

代码语言:javascript
复制
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `new_procedure`( IN _id Integer, IN _Value INTEGER)
BEGIN
IF _id  >  1 THEN
    UPDATE test_table SET `cost_per_record` = 12 WHERE id = 1;
END IF;
     INSERT INTO `test_table` (`id`, `cost_per_record`) VALUES
    (_id,_value);
END$$
DELIMITER ;

并使用

代码语言:javascript
复制
DROP TABLE IF EXISTS `test_table`;
CREATE TABLE `test_table` (
  `id` int(11) NOT NULL PRIMARY KEY,
  `cost_per_record` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `test_table` (`id`, `cost_per_record`) VALUES (1,24);


call new_procedure(2,12);

SELECT * FROM test_table;

插入新行,或者您发现另一个算法可以使用触发器,因此不涉及同一个表

Triggers有很多限制,所以当您尝试创建一个新系统时,请记住这一点

票数 0
EN

Stack Overflow用户

发布于 2020-05-17 21:45:34

对于我来说,下面的解决方案是可行的,所以使用第二个表。我添加了一些智能,因此添加第三个记录将从12个-> 8降低成本。我使用这一点来为从同一个meal_group订购更多食物的人提供折扣。这仍然是一种变通方法,而不是最初的问题,但是嘿。感谢所有人,谁回复了。

代码语言:javascript
复制
DROP TABLE IF EXISTS `test_table`;
DROP TABLE IF EXISTS `sub_table`;
CREATE TABLE `test_table` (
  `id` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `sub_table` (
 `id` int(11) NOT NULL,
 `cost_per_record` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `test_table` (`id`) VALUES (1);
INSERT INTO `sub_table` (`id`, `cost_per_record`) VALUES (1,24);

DELIMITER $$
CREATE TRIGGER `test_insert` AFTER INSERT ON `test_table` FOR EACH ROW 
BEGIN
UPDATE `sub_table` set `cost_per_record` = (24/(SELECT COUNT(*) FROM `test_table`)) ;
INSERT INTO `sub_table` (`id`, `cost_per_record`) VALUES (NEW.ID,(24/(SELECT COUNT(*) FROM `test_table`)));
END
$$
DELIMITER ;

INSERT INTO `test_table` (`id`) VALUES (2);
INSERT INTO `test_table` (`id`) VALUES (3);
SELECT * from `sub_table`;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61849358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档