在MySql

时间:2019-06-11 01:07:02

标签: mysql sql triggers sql-delete delete-row

我有一个名为“ estoque”的表,该表具有一个外键,该表引用了另一个名为“ produto”的表。然后,我在两个表中都填充了几行。

这是我的桌子:

    CREATE TABLE `produto` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `NOME` varchar(45) NOT NULL,
      `PRECO` float NOT NULL,
      PRIMARY KEY (`ID`),
      UNIQUE KEY `NOME_UNIQUE` (`NOME`)
    );

    CREATE TABLE `estoque` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `ID_PRODUTO` int(11) NOT NULL,
      `QUANTIDADE_PRODUTO` int(11) NOT NULL DEFAULT '0',
      PRIMARY KEY (`ID`),
      KEY `fk_Estoque_Produto1_idx` (`ID_PRODUTO`),
      CONSTRAINT `fk_Estoque_Produto1` FOREIGN KEY (`ID_PRODUTO`)
      REFERENCES `produto` (`ID`)
    );

我需要'estoque'来始终引用'product'上的所有现有行。因此,我在产品上创建了AFTER INSERT和AFTER UPDATE触发器:

    CREATE TRIGGER `cadastrar_novo_produto_no_estoque` 
    AFTER INSERT ON `produto` 
    FOR EACH ROW 
    INSERT IGNORE INTO estoque (ID_PRODUTO)
    VALUES (NEW.ID);

编辑:实际上,由于我不能更改'produto'上的'ID'列,因为它是主键,所以我认为我根本不需要AFTER UPDATE触发器。我说的对吗?

    CREATE TRIGGER `atualizar_novo_produto_no_estoque` 
    AFTER UPDATE ON `produto` 
    FOR EACH ROW 
    UPDATE estoque
        SET estoque.ID_PRODUTO = NEW.ID
        WHERE OLD.estoque.ID_PRODUTO = OLD.ID;

现在我需要一个触发器,以便每次我从“产品”中删除一行时,它也将删除“ estoque”中的相应行。

我试图创建一个像这样的人:

    CREATE TRIGGER `deletar_produto_inexistente_no_estoque` 
    BEFORE DELETE ON `produto` 
    FOR EACH ROW DELETE FROM estoque
        WHERE estoque.ID_PRODUTO = ID;

但是每当我尝试从'produto'中删除一行时,都会出现以下错误:

ERROR 1175: 1175: You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. 
SQL Statement:
DELETE FROM `papelaria`.`produto` WHERE (`ID` = '6')

因此,我尝试使用OLD关键字进行尝试,例如:

        CREATE TRIGGER `deletar_produto_inexistente_no_estoque` 
        BEFORE DELETE ON `produto` 
        FOR EACH ROW DELETE FROM estoque
            WHERE OLD.estoque.ID_PRODUTO = OLD.ID;

然后我得到这个错误:

ERROR 1054: 1054: Unknown column 'OLD.estoque.ID_PRODUTO' in 'where clause'
SQL Statement:
DELETE FROM `papelaria`.`produto` WHERE (`ID` = '6')

我想念什么或做错什么了?

PS:不确定是否值得一提,但是我一般对sql和编程还是陌生的,所以如果您在回答时将其考虑在内,我将不胜感激(出于所有目的,请假设我不知道关于任何事情^^)

提前谢谢!

1 个答案:

答案 0 :(得分:1)

您可以将FK修改为:

cordova plugin add https://github.com/cjpearson/cordova-plugin-keyboard

然后,您将不再需要之前删除触发器,因为CONSTRAINT `fk_Estoque_Produto1` FOREIGN KEY (`ID_PRODUTO`) REFERENCES `produto` (`ID`) ON DELETE CASCADE 表中的记录将被自动删除。

类似地,添加estoque将解决您的“更新问题”,以防有人更新记录的PK。

仍不确定为什么要在ON UPDATE CASCADE表中包含虚拟记录。