我有一个表,它是作为select*从一个视图创建的(然后添加了一个pk)。我想用视图中的所有数据定期更新表。我认为最好的选择是使用: INSERT INTO table_a SELECT * FROM view_a ON DUPLICATE KEY UPDATE 值(非键列1),值(非键列1);因为有相当多的列,而且它们在将来可能会更改(然后我可以重新创建表,但是我希望我不必编辑定期插入,我想知道是否有一种方法可以避免显式指定所有列?
INSERT INTO table_a SELECT * FROM view_a ON DUPLICATE KEY UPDATE
nmpmafwu1#
可以在插入操作时使用触发器,即如果主键存在,则更新行,否则插入行。但在大数据的情况下,它肯定会影响性能
5uzkadbs2#
不幸的是,mysql中没有这样的语法。你必须逐个更新所有列。
mefy6pfw3#
我能想到的一件事是从 INFORMATION_SCHEMA.COLUMNS 并使用它们在应用程序中动态组合查询。
INFORMATION_SCHEMA.COLUMNS
SELECT * FROM information_schema.columns WHERE table_name = 'view_a';
现在,无论视图是否更改,您都有了列。对表执行相同的操作,就会得到列差异。使用这些差异来运行altertable语句,或者删除它并一起重新创建它。当然,这可能比手动删除和重新创建表更费力。
3条答案
按热度按时间nmpmafwu1#
可以在插入操作时使用触发器,即如果主键存在,则更新行,否则插入行。但在大数据的情况下,它肯定会影响性能
5uzkadbs2#
不幸的是,mysql中没有这样的语法。你必须逐个更新所有列。
mefy6pfw3#
我能想到的一件事是从
INFORMATION_SCHEMA.COLUMNS
并使用它们在应用程序中动态组合查询。现在,无论视图是否更改,您都有了列。
对表执行相同的操作,就会得到列差异。使用这些差异来运行altertable语句,或者删除它并一起重新创建它。
当然,这可能比手动删除和重新创建表更费力。