在插入前触发,从名字和姓氏中创建一个主键。

问题描述 投票:0回答:2

我需要为我的数据库表 "People "从名字和姓氏中生成一个主键char(3),我有旧的数据库继承,我必须复制这个id。例如,从'John''Smith'中,我想生成id'JOS',然后如果有两个'John Smith',它应该像这样'JSM'等等。所以我想,我可能可以做到这一点,作为插入前的触发器,这是真的可能吗? 如果是,它是最好的方式来做呢?如何设置触发器。

CREATE OR REPLACE TRIGGER cacciatore_bef_ins
BEFORE INSERT ON eddo.CACCIATORI
referencing old as "old" new as "new"
FOR EACH ROW
DECLARE
temp char(3);
pos number :=1;
BEGIN
temp:=genera_cod(new.nome,new.cognome,pos);
while esiste(temp)= true 
LOOP
    temp:=genera_cod(new.nome,new.cognome,pos+1)
END LOOP;
new.codcacciatore:=temp;
END
end cacciatore_bef_ins
/
database oracle plsql triggers database-trigger
2个回答
0
投票

我有旧的数据库继承和我 不得不 复制这个ID。

说谁呢?事实上,你继承的东西 坏的 并不意味着你必须让它 更差. 只是好奇:第三个约翰-史密斯的主键值会是多少?琼-斯马登呢?又是一个JOS以及JSM。

我建议你

  • 守旧
  • 保持列数据类型
    • 由于外键约束,很难改变主键数据类型和值。如果没有,可以考虑换成更容易维护的东西
  • CHAR(3) 建议你不要指望在这个表中有很多行。有(英文字母)26^3=17.576种可能的组合。对于你存储的内容来说,这可能已经足够了,但是对于那些 "John Smith "的变体来说,你可能会超过组合。如何找到一个可用的主键?这取决于你使用的算法(根据你的描述和我的第一个问题,我不确定是哪种算法)。
  • 最后,看看你是否可以使用一些 "更简单 "的东西,如
    • 所有数字 000999),那么
    • 字母+2位数(如) A00, A01, ..., A99, B00, B01, ...)
    • 诸如此类

0
投票

馊主意还是馊主意,哪怕数据量再小。事实上是由手工系统转换而来,就更应该改变,反正其他一切都会不一样。 手工操作合理的流程,在自动化的时候就会惨遭失败。这就是一个典型的例子。 在手动系统中,减少到3个字母是一个好的、有效的、高效的过程。它能让我很快地找到文件柜的正确部分。从那里,我只需要扫描几个文件,以便找到所需的确切文件。那是手动的。 在自动化系统中,这恰恰相反--它是无效的、低效的、有限的。我可以很有信心地猜测,你的3个字母的代码来自于个人名字的第一个字母,中间,姓。(当然也可能是由其他的东西推导出来的,但还是算了吧)。 这对一个人来说既自然又直观,如果有多个约翰-O-史密斯(JOS)或琼-奥菲利亚-桑德斯(JOS)--那么就有其他手段(数据点)来识别确切的文件。在自动系统上就不是这样。我很难想象有人会认为OOS是琼-奥菲利亚-桑德斯的指示。但作为自动化系统,这是一个非常简单的算法变化。 如果你认为3char代码查找真的需要维护,这不是一个坏的假设,那么将其添加为一列,并创建一个非唯一索引。当用户输入'JOS'时,提供一个限定名称的列表,也许还有另一个数据点(比如地址)可以选择--就像手动文件柜一样。那么你不需要尝试使其成为唯一的--事实上你并不想要唯一。 然而,对于你的Primacy键,只需使用一个生成的整数(序列)。 另外,今天的提示。使3个字母的代码列varchar2(3)而不是char(3)。

© www.soinside.com 2019 - 2024. All rights reserved.