Oracle 11g数据库Python程序实现面包表ID自增求助
实现Oracle 11g中BreadID自动递增的Python方案
嗨,我来帮你搞定BreadID自动递增的需求!这里有两种实用方案,优先推荐数据库端的实现,能避免并发场景下的ID冲突问题:
方法1:数据库端用序列+触发器(推荐)
把ID递增的逻辑放在数据库层面,这是生产环境里最稳妥的做法。
第一步:创建生成ID的序列
先登录Oracle数据库,执行下面的SQL创建一个序列,用来自动生成BreadID:
CREATE SEQUENCE bread_id_seq START WITH 1 -- 从1开始生成ID INCREMENT BY 1 -- 每次加1 NOCACHE -- 不缓存序列值,避免意外断连后丢失ID NOCYCLE; -- 到达最大值后不循环(Oracle默认最大值很大,一般不用管)
第二步:创建插入触发器
接着创建一个触发器,当往BREAD表插入数据时,自动把序列的下一个值填充到BreadID字段:
CREATE OR REPLACE TRIGGER bread_id_trigger BEFORE INSERT ON BREAD FOR EACH ROW BEGIN -- 这里的:NEW.BID要和你表中的BreadID列名对应,如果列名是BreadID就改成:NEW.BREADID SELECT bread_id_seq.NEXTVAL INTO :NEW.BID FROM DUAL; END; /
第三步:修改Python代码
现在就完全不用手动输入BreadID了,直接删掉相关输入行,调整INSERT语句即可:
# 移除手动输入BreadID的代码 Name = input("Please enter the name for the new bread: ") LoafPrice = int(input("Enter the price in pence: ")) Calories = int(input("Enter the calories: ")) # 注意:一定要明确指定INSERT的列名,不要省略!这样数据库才知道自动填充BID cur.execute( "INSERT INTO BREAD (BName, BCal, BPrice) VALUES (:BName, :BCal, :BPrice)", {'BName': Name, 'BCal': Calories, 'BPrice': LoafPrice} ) # 别忘了提交事务,否则数据不会写入数据库 conn.commit()
方法2:Python端查询最大ID后递增(仅适合低并发场景)
如果暂时不想修改数据库,可以在Python里先查当前最大的BreadID,再加1作为新ID,但这种方法在多用户同时插入时可能会出现ID重复,谨慎使用:
# 先查询当前表中最大的BreadID,用NVL处理空表的情况(空表时返回0) cur.execute("SELECT NVL(MAX(BID), 0) FROM BREAD") max_id = cur.fetchone()[0] new_bread_id = max_id + 1 # 后续输入和插入逻辑不变,只是用自动生成的new_bread_id Name = input("Please enter the name for the new bread: ") LoafPrice = int(input("Enter the price in pence: ")) Calories = int(input("Enter the calories: ")) cur.execute( "INSERT INTO BREAD VALUES (:BID, :BName, :BCal, :BPrice)", {'BID': new_bread_id, 'BName': Name, 'BCal': Calories, 'BPrice': LoafPrice} ) conn.commit()
内容的提问来源于stack exchange,提问作者Rex Richards
相关产品推荐
相关产品推荐

