我必须创建一个名为vecesCarcel的表,每当我插入一个名称时,它会自动添加另一个单元格,其中包含该名称出现在另一个表中的次数。到目前为止,我已尝试使用触发器,但没有结果:
USE lordfarquaad;
CREATE TABLE IF NOT EXISTS vecesCarcel(
nombrePersonaje VARCHAR(10),
veces INTEGER(5) UNSIGNED)
ENGINE=InnoDB;
ALTER TABLE vecesCarcel
ADD CONSTRAINT vecesCarcelFK1 FOREIGN KEY(nombrePersonaje)
REFERENCES personajes(nombrePersonaje)
ON DELETE CASCADE ON UPDATE CASCADE;
USE lordfarquaad;
DELIMITER $$
CREATE PROCEDURE checkvecescarcel(IN nombre VARCHAR(10),OUT veces INT(5))
BEGIN
SET veces=(SELECT COUNT(*) FROM historiales WHERE nombrePersonaje=nombre);
END
$$
CREATE TRIGGER vecesCarcel_Insert BEFORE INSERT ON vecesCarcel FOR EACH ROW
BEGIN
CALL checkvecescarcel(NEW.nombrePersonaje,NEW.veces);
END;
$$
答案 0 :(得分:1)
如果你想使用触发器,你必须在触发器中设置new.veces-value:
CREATE TRIGGER vecesCarcel_Insert BEFORE INSERT ON vecesCarcel FOR EACH ROW
SET new.veces=(SELECT COUNT(*) FROM historiales
WHERE nombrePersonaje=NEW.nombrePersonaje);
您可能也想创建一个on update
- 触发器(相同的代码,因此您可以将select count(*)...
放在一个函数中并使用set new.veces = myfnct(new.nombrepersonaje)
)。
但请记住,如果您更改表historiales
中的任何内容,您的计数将不会自动更新(例如,在列表中添加名称中的其他条目)。因此,根据您的设置,以及您的historiales
- 表是否可以更改,或者您可能想要尝试其他方法,您可以尝试查看:
create view vecesCarcelView as
select nombrePersonaje,
(select count(*)
from historiales
where vecesCarcel.nombrePersonaje=historiales.nombrePersonaje) as veces
from vecesCarcel;
(如果您对订单不太在意,可以使用left join
和group by
执行此操作;您实际上可以使用整个{{1}的视图} -table显示所有已知名称的计数。)