我是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_amount
和library1
表中两个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;
答案 0 :(得分:0)
您可以定义任何类型的列,只要它有效,然后使用其他表中的数据填充它。这通常被称为"非正规化"在理想的情况下,您希望将数据存储在其他表中并按需计算,这样您的保存值和源数据就不会失去同步。
您还可以定义一个VIEW
,它就像一个保存的查询,就好像它是一个表一样。这可以做各种事情,比如动态查询其他表,并将结果显示为列。 A"物化视图"某些数据库支持的是基于某些隐式触发器自动更新和保存视图的位置。非物化视图速度较慢,但在您的情况下,速度差异可能不是很大。
所以你可以选择如何代表这一点。
需要注意的一点是,您应该使用INT
作为默认值"整数"字段,而不是INT(100)
之类的东西。整数字段的数字指定了您预期的有效位数,而INT
最多只能存储11位数。这是非常不合适的。
答案 1 :(得分:0)
不是直接的,但有几种方法可以实现您的目标。
在select子句中创建一个psuedo列,添加另外两列
select *, columna+columnb AS `addition` from books
不要忘记将columna
和columnb
换成列名,将addition
换成您希望psuedo列的名称
或者,您可以使用视图以相同的方式自动添加psuedo字段。但是,视图没有索引,因此在其中执行查找并加入它们可以非常容易地变慢。
您还可以使用触发器在插入和更新时设置值,或者只是计算插入数据库的语言中的值。
答案 2 :(得分:0)
如果library1
和library2
表具有与表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
;