【问题标题】:Oracle - convert a value to 0 after INSERTOracle - 插入后将值转换为 0
【发布时间】:2023-03-13 11:08:01
【问题描述】:

我有一张叫Army的表。有以下属性:

军队

  • army_name VARCHAR(50) 主键
  • number_of_soliders 整数;

插入此表后,我需要将 number_of_soliders 转换为 0(或只允许插入 0)。

如何做到这一点?

【问题讨论】:

  • 顺便说一句,士兵在“d”之后有“i”。
  • 哦,谢谢我不是母语人士,有些英语单词很棘手:P

标签: sql oracle triggers


【解决方案1】:

由于这是part of a school project,您需要使用CREATE TRIGGER 语句并修改值BEFORE INSERT ON army 并执行FOR EACH ROW

在触发器的 PL/SQL 块中,需要使用:new 记录,并使用:NEW.number_of_soldiers := 0;number_of_soldiers 属性设置为零。

CREATE TRIGGER 的文档是 here

【讨论】:

  • 好吧,我试过这个:在每行插入军队后创建或替换触发器 TRG_SOLIDER_NUMBER 开始更新军队 SET number_of_soliders = 0 WHERE Army_name = :new.army_name;结尾;但我不断收到错误:表正在变异,触发器/函数可能看不到它,并且第二行出现错误。我也试过这个:在插入军队之前创建或替换触发器 TRG_SOLIDER_NUMBER 每行开始更新军队 SET :new.number_of_soliders := 0;结尾;但根据 SQL 开发人员的说法,这有错误的语法
  • 不要使用UPDATE 语句。正如我在答案中所说,使用 BEFORE INSERT 触发器,然后只使用 PL/SQL 语句 :NEW.number_of_soldiers := 0;,而 PL/SQL 块中没有其他内容。
  • 天哪,我终于明白了!非常感谢,我欠你一杯啤酒,哈哈
【解决方案2】:

您可以尝试更改列并将默认值设置为0

因此,当您插入army_name 时,该行将默认将number_of_soliders 作为0

ALTER TABLE ARMY MODIFY number_of_soliders default 0;

【讨论】:

  • 从 12c 开始 default on null 防止显式输入空值。但是,这里的 OP 不寻常的要求是所有输入的值都应替换为 0,而不仅仅是空值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多