【问题标题】:MySQL Creating trigger on view - Error 1347MySQL 在视图上创建触发器 - 错误 1347
【发布时间】:2013-12-20 06:10:13
【问题描述】:

我应该写一个触发器来检查BEFORE INSERT记录是否已经存在,然后采取一些行动。在针对Koncerty 视图发出INSERT 声明时,我遇到了这个错误:

错误代码:1347。“BazyLista3.Koncerty”不是基表

这是 view Koncerty 的代码:

CREATE VIEW Koncerty (`nazwa_klubu`, `adres_klubu`, `nazwa_zespolu`,
`ilosc_czlonkow_zespolu`, `data_wystepu`) AS  
( SELECT `nazwa_klubu`, `kb`.`adres`, `nazwa_zespolu`, `zs`.`ilosc_czlonkow`,
`data_wystepu` FROM `Koncert` AS kc
INNER JOIN `Klub` AS kb ON `kc`.`nazwa_klubu` = `kb`.`nazwa`
INNER JOIN `Zespol` AS zs ON `kc`.`nazwa_zespolu` = `zs`.`nazwa` );

还有我的触发器,我有这个错误:

DROP TRIGGER IF EXISTS `before_koncerty_insert`
DELIMITER $$
CREATE TRIGGER `before_koncerty_insert` BEFORE INSERT ON `Koncerty`
FOR EACH ROW
BEGIN

DECLARE i INT DEFAULT 0;

SELECT COUNT(*) INTO i FROM `Koncerty` WHERE 
`nazwa_klubu` = NEW.`nazwa_klubu` AND
`adres_klubu` = NEW.`adres_klubu` AND
`nazwa_zespolu` = NEW.`nazwa_zespolu` AND
`ilosc_czlonkow_zespolu` = NEW.`ilosc_czlonkow_zespolu` AND
`data_wystepu` = NEW.`data_wystepu`;



IF i > 0 THEN
SIGNAL SQLSTATE '58005'
SET MESSAGE_TEXT = 'Blad! Taka krotka juz istnieje';
END IF;

END $$
DELIMITER ;

表格

CREATE TABLE IF NOT EXISTS `Klub`
(
    `nazwa` varchar(50) NOT NULL,
    `adres` varchar(70) NOT NULL,
    PRIMARY KEY (`nazwa`)
) ENGINE = InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `Zespol`
(
    `nazwa` varchar(50) NOT NULL,
    `ilosc_czlonkow` int(3) NOT NULL,
    PRIMARY KEY (`nazwa`)
) ENGINE = InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `Koncert`
(
    `nazwa_klubu` varchar(50) NOT NULL,
    `nazwa_zespolu` varchar(50) NOT NULL,
    `data_wystepu` datetime NOT NULL,
    FOREIGN KEY (`nazwa_klubu`) REFERENCES `Klub`(`nazwa`),
    FOREIGN KEY (`nazwa_zespolu`) REFERENCES `Zespol`(`nazwa`)
) ENGINE = InnoDB DEFAULT CHARSET=utf8;

我该如何解决这个问题?

【问题讨论】:

  • 我认为 MySQL 不支持视图触发器。
  • 我是说您不能在视图上创建触发器。防止重复最好在基表上使用主约束或唯一约束

标签: mysql view triggers


【解决方案1】:

MySQL 不支持视图触发器,来自MySQL reference manual

您不能将触发器与TEMPORARY 表或视图相关联。

【讨论】:

  • 接受的答案是正确的,我只是认为添加参考会很好。
  • 感谢您的跟进。您可以建议对我的答案进行编辑并将其包含在内,以保持紧密:-)
【解决方案2】:

MySQL 不支持视图触发器。

完成此任务的方法是使Koncerty 成为一个没有键的,然后通过触发操作对其进行操作。一切都如我所愿。

此外,在表中的记录上设置UNIQUE CONSTRAINTS 对唯一记录也有作用,因为它在尝试添加任何类似内容时会弹出错误。

【讨论】:

    【解决方案3】:

    如果视图使用了其中的数据库名称,则可能会出现错误。例如,如果一个视图使用了一个表作为<dbname>.<tablename>

    create or replace view dealer_current_stage as
        select 
            dsc.dealer_id,
            dsc.new_stage current_stage,
            dsc.change_date last_stage_change_date
        from
            dealer_current_stage_pre dcsp
                left join
            risk.dealer_stage_changes dsc ON dsc.change_date = dcsp.max_stage_change_date
                and dsc.dealer_id = dcsp.dealer_id
        group by dsc.dealer_id;
    

    这里,risk 是一个不同的数据库,它的表正在被使用。所以最好不要使用单独的数据库和表,如果必须使用它,请考虑权限等。

    【讨论】:

      猜你喜欢
      • 2013-07-16
      • 2014-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 2016-02-11
      • 2014-08-11
      相关资源
      最近更新 更多