AnyLogic报错「Not unique database」:基于Excel订单数据按条件分流至两个队列失败
Hey Selina,我来帮你搞定这个头疼的报错问题~这个「Not unique database」错误本质是AnyLogic认为你的Excel数据源存在主键重复、数据源配置冲突,或者数据读取逻辑导致重复访问同一行数据,下面是一步步的排查和解决方法:
检查Excel数据源的主键设置
这是最常见的原因:打开Project面板里的Data Sources,找到你导入的Excel文件,右键选择Edit。在弹出的配置窗口里,确保你指定了唯一的主键列——比如你的订单表中的「Bestellnummer」(订单编号),因为每个订单肯定是唯一的。如果之前没设置主键,或者主键列里有重复值(比如Excel里不小心输入了相同的订单号),AnyLogic就会报这个错。你可以先在Excel里用条件格式检查一下订单编号列有没有重复值,修正后再回到AnyLogic里设置主键。修正Source生成Agent的逻辑
你在Source里生成订单Agent时,要确保每次生成对应Excel里的唯一一行数据:- 如果用的是「Select from database」模式,要避免重复读取同一行;
- 更稳妥的方式是在Source的「On agent created」事件里,把Excel行的属性赋值给Agent——比如先给你的Order Agent添加一个
typ属性,然后写:agent.typ = row.Typ;(这里的row是你从数据源读取的行对象); - 不要在Source里重复加载数据源,比如不要多次调用
selectFrom()导致冲突。
调整分流逻辑的判断方式
你用来分流的模块(比如Decision Point或者Separate),判断条件要直接用Agent自身的属性,而不是每次分流都去查询数据库。比如你的分流条件应该写:agent.typ.equals("Sonderbau")这样既高效,又不会因为重复查询数据库导致主键冲突。
排查重复的数据源配置
去Project面板的Data Sources里看看,是不是不小心添加了同一个Excel文件两次?如果有重复的数据源,AnyLogic会认为数据库不唯一,直接删掉多余的那个配置就行。
如果按照上面的步骤还是解决不了,可以把你Source里的查询逻辑代码,或者Excel数据源的配置细节描述一下,我再帮你精准排查~
备注:内容来源于stack exchange,提问作者Selina Weninger

