【问题标题】:Update column value after insert into table using trigger使用触发器插入表后更新列值
【发布时间】:2020-12-18 05:12:06
【问题描述】:

插入后我需要更新表中的 ID 列。 ID 是 varchar 和自动增量。我需要更新 ID 的值。 例如。 当我们插入一列时,ID 值应该是 10,所以在触发器执行后,ID 值应该更新为 10F。

【问题讨论】:

  • 听起来这是一个渲染问题。使用/显示 ID 时不能只连接“F”吗?
  • 先生不能这样做,因为 ID 值是用来区分其他 ID 值的。我需要创建一个触发器,以便在插入新列时更新 ID 列并将“F”连接到它。
  • 好的。那么听起来 ID 并不是真正的 ID,而是真正的复合键的一部分。从根本上说,ID 永远不应该改变,即使在插入时的触发器中也不应该改变。一般来说,触发器是一个坏主意。将代码放在易于测试和理解的应用层中。或者为 id_suffix 添加另一列并加入/使用 ID 和该列的串联
  • 先生,实际情况是,有 2 个不同的表包含 ID 列,现在我们有一个查询可以从两个表中获取数据(使用联合)。现在这个 ID 列用于知道列数据来自哪个表,因此我必须编写代码。我不允许向表中添加新列。
  • 实际上的情况是,有 2 个不同的表包含 ID 列,现在我们有一个查询可以从两个表中获取数据(使用联合)。现在这个 ID 列用于知道列数据来自哪个表,因此我必须编写代码。 在您的 UNION 代码中执行此操作:SELECT *, '1' source FROM table1 UNION ALL SELECT *, 2 FROM table2

标签: mysql


【解决方案1】:

根据您的 cmets,您不需要永久修改 ID 列,无论如何您都不应该这样做,而只能在某些查询期间进行。

在 join 中使用 ID 来区分一行来自哪个表也是一个简单的想法 - ID 中不应包含任何“编码”信息:它们应该是无意义的唯一值。

如果你的设计被破坏了,你绝对必须修改 ID:

select concat(id, 'F') as ID, other_columns from tableA
union all
select ID, other_columns from tableB

或者更好的是,引入一个额外的列来指示每行来自哪个表:

select *, 'F' as origin from tableA
union all
select *, '' as origin from tableB

【讨论】:

    猜你喜欢
    • 2021-10-26
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    相关资源
    最近更新 更多