我有一个名为“ 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和编程还是陌生的,所以如果您在回答时将其考虑在内,我将不胜感激(出于所有目的,请假设我不知道关于任何事情^^)
提前谢谢!
答案 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
表中包含虚拟记录。