MySQL - 如何使列成为来自不同表的另外两列的总和?

时间:2017-11-23 21:37:08

标签: mysql sql

我是MySQL和数据库的新手。是否有可能创建一个表,其中列是另外两个表中另外两列的总和。 例如,如果我有数据库`Books:

CREATE TABLE `books` (
  `book_id` int(100) NOT NULL,
  `book_name` varchar(20) NOT NULL,
  `book_author` varchar(20) NOT NULL,
  `book_co-authors` varchar(20) NOT NULL,
  `book_edition` tinyint(4) NOT NULL,
  `book_creation` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `book_amount` int(100) NOT NULL COMMENT 'Amount of book copies in both University libraries'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

如何将列book_amount作为book_amountlibrary1表中两个library2列的总和,book_id = book_id? 图书馆1:

CREATE TABLE `library1` (
  `book_id` int(11) NOT NULL,
  `book_amount` int(11) NOT NULL,
  `available_amount` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3 个答案:

答案 0 :(得分:0)

您可以定义任何类型的列,只要它有效,然后使用其他表中的数据填充它。这通常被称为"非正规化"在理想的情况下,您希望将数据存储在其他表中并按需计算,这样您的保存值和源数据就不会失去同步。

您还可以定义一个VIEW,它就像一个保存的查询,就好像它是一个表一样。这可以做各种事情,比如动态查询其他表,并将结果显示为列。 A"物化视图"某些数据库支持的是基于某些隐式触发器自动更新和保存视图的位置。非物化视图速度较慢,但​​在您的情况下,速度差异可能不是很大。

所以你可以选择如何代表这一点。

需要注意的一点是,您应该使用INT作为默认值"整数"字段,而不是INT(100)之类的东西。整数字段的数字指定了您预期的有效位数,而INT最多只能存储11位数。这是非常不合适的。

答案 1 :(得分:0)

不是直接的,但有几种方法可以实现您的目标。

在select子句中创建一个psuedo列,添加另外两列

select *, columna+columnb AS `addition` from books

不要忘记将columnacolumnb换成列名,将addition换成您希望psuedo列的名称

或者,您可以使用视图以相同的方式自动添加psuedo字段。但是,视图没有索引,因此在其中执行查找并加入它们可以非常容易地变慢。

您还可以使用触发器在插入和更新时设置值,或者只是计算插入数据库的语言中的值。

答案 2 :(得分:0)

如果library1library2表具有与表books类似的架构,则以下查询将起作用:

Insert into books
    select l1.book_id,
           l1.book_name,
           l1.book_authors,
           l1.book_co_authors,
           l1.book_edition,
           l1.book_creation,
           (l1.book_amount + l2.book_amount)
    from library1 l1
    inner join library2 l2
    on l1.book_id = l2.book_id
    group by l1.book_id
    ;