使用计算值在SQL中创建新表

时间:2014-04-14 19:09:33

标签: sql alter-table

如果我在MySQL中有一个包含几列的表,并希望创建一个永久列,它是另外两列的总和(类似于每行的预设值的alter table语句),我该怎么做?

E.g。

ColumnA, ColumnB, ColumnC
1, 21, 41
4, 81, 12

我希望D列是A列和B列的总和,并且是永久性的。我知道我可以运行一个只是'选择ColumnA,ColumnB,ColumnA + ColumnB AS ColumnD From MyTable'的查询,但这不会使D列成为表的永久部分。

2 个答案:

答案 0 :(得分:3)

为什么不创建如下的视图。好吧,它不会存储数据,除非你把它作为参数化视图,并且每当你说select * from myview时它会触发select对基表,但仍然是一个有效的选项。

create view myview
as
Select ColumnA, ColumnB, ColumnA+ColumnB AS ColumnD From MyTable

否则,您可以像下面一样完全维护一个单独的表。

create table derivedtable
as
Select ColumnA, ColumnB, ColumnA+ColumnB AS ColumnD From MyTable

或者,在您的表格中设置columnD int null并创建after insert触发器并填充该列,如

CREATE TRIGGER `trg_calc` 
AFTER INSERT ON `MyTable` 
FOR EACH ROW  
    UPDATE `MyTable` SET `ColumnD` = ColumnA+ColumnB 
WHERE `id` = NEW.id; 

假设您的表具有唯一的id列。

答案 1 :(得分:0)

在mysql中没有简单的方法可以做到这一点。如果你真的想要列,那么触发器将是你最好的选择。

在查询中添加一些表达式也可能没问题。请记住,DBMS通常花费大部分时间等待磁盘提供更多记录来进行咀嚼。如果处理这些记录需要更长的时间,您可能在查询中看不到任何额外的时间。从本质上讲,如果没有更多的工作要做,DBMS就会一直在睡觉或忙着等待。

最后,如果确实需要提前进行计算,并且您希望比几个触发器更容易使用,则可以切换数据库供应商:

wiki文章了解更多信息:http://en.wikipedia.org/wiki/Virtual_column