我需要一个表中的信息来反映另一个表中生成的列

时间:2021-06-16 10:08:24

标签: mysql

我有两张桌子:

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。

我该怎么做?

2 个答案:

答案 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;

请记住,关系表不是电子表格,因此不要尝试像使用电子表格一样使用它们!

顺便说一句,您不需要也不应该引用数字文字。