MySQL在视图上创建触发器 - 错误1347

时间:2013-12-03 23:25:16

标签: mysql view triggers

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

  

错误代码:1347。'BazyLista3.Koncerty'不是BASE TABLE

以下是查看 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;

如何解决此问题?

3 个答案:

答案 0 :(得分:4)

MySQL不支持视图触发器。

执行此任务的方法是使Koncerty成为没有键的,然后使用触发器操作对其进行操作。这一切都按照我想要的方式进行。

此外,对表中的记录进行UNIQUE CONSTRAINTS会为唯一记录执行任务,因为在尝试添加任何内容时会弹出错误。

答案 1 :(得分:1)

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

您无法将触发器与TEMPORARY表或视图相关联。

答案 2 :(得分:-2)

如果视图中使用了数据库名称,则可能会出现错误。例如,如果视图将表用作<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是一个不同的数据库,正在使用它的表。所以最好不要使用单独的数据库和表,如果你必须使用它,那么考虑权限等。