我有两张桌子:
CREATE TABLE FlockTot
(Shed_num varchar(250) NOT NULL,
flocknum INT NOT NULL);
INSERT into FlockTot (Shed_num, flocknum)
Values
('Shed1','2200'),
('Shed2','2100'),
('Shed3','2000'),
('Shed4','2500');
Create Table FlockChanges
(shed_num varchar(250) NOT NULL,
removed INT,
deceased INT,
total_reduced INT generated always as (removed+deceased) stored);
INSERT into FlockChanges (shed_num, removed, deceased)
Values
('Shed1','1','2'),
('Shed2','3','4'),
('Shed3','2','2'),
('Shed4','5','5');
现在我想在 FlockTot 中添加一个生成的 always 列,该列是 flocknum-totalreduced。
我该怎么做?
答案 0 :(得分:0)
CREATE TRIGGER tr_ai_update_FlockTot
AFTER INSERT
ON FlockChanges
FOR EACH ROW
UPDATE FlockTot SET new_col = flocknum - NEW.total_reduced;
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=2c40a34e66c111ecb27d75223e972a4a
答案 1 :(得分:0)
生成的列无法访问其他表的列。但是您可以使用视图。假设 shed_num
是两个表中的主键(或至少是一个键),大致如下:
CREATE VIEW flocktot_with_totalreduced
AS
SELECT ft.shed_num,
ft.flock_num,
ft.flock_num - coalesce(fc.total_reduced, 0) totalreduced
FROM flocktot ft
LEFT JOIN flockchanges fc
ON fc.shed_num = ft.shed_num;
如果 shed_num
不是键,您可能还需要一些聚合。
然而,您的设计似乎从一开始就有缺陷。 flockchanges
应该是唯一一个只有一个整数列用于更改和另一个用于可选原因的物化表。要获得当前总数,请使用聚合 flockchanges
的视图。
CREATE TABLE flockchanges
(id integer
AUTO_INCREMENT,
shed_num varchar(250)
NOT NULL,
change integer
NOT NULL,
reason varchar(256),
PRIMARY KEY (id));
INSERT INTO flockchanges
(shed_num,
change,
reason)
VALUES ('Shed1',
2200,
NULL),
('Shed2',
2100,
NULL),
('Shed3',
2000,
NULL),
('Shed4',
2500,
NULL),
('Shed1',
-1,
'Removed'),
('Shed1',
-2,
'Deceased'),
('Shed2',
-3,
'Removed'),
('Shed2',
-4,
'Deceased'),
('Shed3',
-2,
'Removed'),
('Shed4',
-3,
'Deceased'),
('Shed1',
-5,
'Removed'),
('Shed4',
-5,
'Deceased');
CREATE VIEW flocktot
AS
SELECT shed_num,
sum(change) flocknum
FROM flockchanges
GROUP BY shed_num;
请记住,关系表不是电子表格,因此不要尝试像使用电子表格一样使用它们!
顺便说一句,您不需要也不应该引用数字文字。