【问题标题】:SQL Trigger, Update view after insertSQL触发器,插入后更新视图
【发布时间】:2021-05-01 17:16:45
【问题描述】:

我正在为一个学校项目开发数据库。我想创建一个触发器,在将数据插入视图后更新视图并按升序对其进行排序。

这就是我目前所拥有的。如果你们能帮助我,我将不胜感激,谢谢!

 AFTER INSERT
 AS
 UPDATE vw_Highscore

【问题讨论】:

  • MySQL 还是 SQL Server?无论如何存储您的数据排序听起来是错误的,您应该在查询时对其进行排序。官方文档显示了正确的触发器。而且您需要澄清您的更新实际上应该做什么。
  • 我正在研究 MySQL
  • @zjxstin 我错过了什么吗?引用official MySQL siteA.6.5。 MySQL 8.0 有物化视图吗? |不。 你打算在 vew 中更新什么,本质上只是一个保存的SELECT 语句?

标签: mysql sql view triggers


【解决方案1】:

我假设您的意思是按视图表上的一个特定列按升序排序。那很容易。你绝对不需要触发器。只需在视图表中包含主键或任何索引。

当您在表上放置主键或任何类型的索引时,由于 BTREE 索引的工作方式,它们将自动按升序存储。因此,当您查询它们时,它们将始终被排序,除非另一个索引覆盖它们。在大多数情况下,主键会覆盖所有其他索引。但是,如果您想在查询中包含主键,但按其他方式排序,则使用 ORDER BY 子句。

例如,假设我有一个带有 ID、名称和地址列的 customer 表。当我做SELECT * FROM customer; 时,我会得到这个结果:

ID    name
1     John
2     Adam
3     Sue

注意 id 是如何排序的,而 name 列没有?

如果我将查询更改为 SELECT * FROM customer ORDER BY name; 现在我会得到这个结果:

ID    name
2     Adam
1     John
3     Sue

由于您的视图表与基表同步,这意味着您的视图中应该始终拥有最新的排序结果。

或者,如果您想将其硬编码到您的视图表中而不依赖于索引,那么只需在您的 create view 语句中使用以下语法: CREATE VIEW view_name AS SELECT * FROM base_table ORDER BY column.

现在,您的视图将始终按照您在 ORDER BY 部分中指定的列以排序格式存储其结果。

除了我上面提到的解决方案之外,您还可以尝试创建一个 CREATE TRIGGER 语句。但是根据您的问题,这似乎是一种过于复杂且毫无意义的方法。更新视图与更新它的基表相同,因此如果正在执行插入语句,那么它已经自动更新您的视图表。如果像我上面提到的那样,您的视图中包含基表中的索引或主键,或者您在CREATE VIEW 语句中使用了ORDER BY 子句,那么它将按字母/数字按升序对自身进行排序,而无需您需要采取其他措施。

【讨论】:

  • 我在官方文档中没有找到要点,但是在SQL中保证行顺序的唯一方法是ORDER BY子句。但它应该在视图之外使用,完全是数据检索任务的一部分。
  • 确实,我必须搜索一段时间才能明确指出:“索引构建分为三个阶段。在第一阶段,扫描聚集索引,生成索引条目并添加到排序缓冲区。...在第二阶段,将一个或多个运行写入临时中间文件,对文件中的所有条目执行合并排序。在第三阶段和最后一个阶段,插入排序的条目进入 B 树。” - dev.mysql.com/doc/refman/8.0/en/sorted-index-builds.html所以你不需要在索引中指定ASC,但降序需要DESC。
  • 当然索引是以排序的方式存储的,这就是B-tree的工作原理。我的陈述是关于查询结果的,应该使用ORDER BY 明确排序,而不依赖于某些结构或存储类型。
  • 哦,我明白了。是的,我同意你的看法。我只是展示了一种方法,如果原始提问者坚持做那件事,他们可以将数据存储为排序数据,而无需使用触发器进行更新。但是 Order By 绝对是进行排序的最佳方式,这里没有争议。
猜你喜欢
  • 1970-01-01
  • 2012-05-27
  • 2018-05-26
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多