2

我有 3 个现有表:transactions、、transaction_typesexpenses

$> USE `mydb`;

   Datebase changed.

$> SHOW TABLES;

   expenses
   transactions
   transaction_types

expenses调用过程中添加存储过程和 2 个触发器后,我无法再插入表中:

$> INSERT INTO `expenses` SET `date`='2013-12-22';

   1109. Unknown table 'expenses' in field list

$> INSERT INTO `expenses` (`date`) VALUES('2013-12-22');

   1109. Unknown table 'expenses' in field list

不过能选的就好了……</p>

如果我放下触发器,我可以再次插入expenses

我的 2 个触发器是重复的,1 个用于更新,1 个用于插入:

USE `mydb`;

DELIMITER $$

DROP TRIGGER IF EXISTS `expense_updated_paid`
CREATE TRIGGER `expense_updated_paid`
    AFTER UPDATE ON `expenses` FOR EACH ROW
    BEGIN
        CALL `expense_paid`( NEW.`id` , NEW.`date paid` , NEW.`amount`);
    END$$

和程序:

USE `mydb`;
DROP procedure IF EXISTS `expense_paid`;

DELIMITER $$

CREATE PROCEDURE `expense_paid`(IN `expense_id` INT, IN `date` DATE, IN `amount` INT)
    BEGIN
        IF `expenses`.`date paid` IS NOT NULL THEN
            SET @type_id = (SELECT `id` FROM `transaction_types` WHERE `name` = 'reimbursement');
            INSERT INTO `transactions`
                SET
                    `transactions`.`date` = `date`,
                    `transactions`.`amount` = `amount`,
                    `transactions`.`type_id` = @type_id,
                    `transactions`.`note` = `expense_id`;
        END IF;
    END$$

如果导致问题,我希望 MySQL 会抱怨触发器或过程中的某些内容,而不是告诉我该表不存在……</p>

4

1 回答 1

1

既然您提供了过程代码,答案就很清楚了:

    IF `expenses`.`date paid` IS NOT NULL THEN

该过程没有上下文expenses.*。也就是说,当限定符引用过程外部的查询时,不能在过程内部使用限定列名。如果您接受列限定符是指给定查询中的相关名称,而不是表本身,这将更有意义。

但是该过程确实有date输入参数,您将其作为相同的NEW.\付款日期传递。因此,将行更改为以下内容:

    IF `date` IS NOT NULL THEN
于 2014-01-03T03:32:40.110 回答