oracle 订单表主键为自增主键,如何动态的和订单详情表关联?

----订单表
CREATE TABLE DD_ORDER
(

    ORDER_ID    VARCHAR2(10)   PRIMARY KEY NOT NULL, ---订单编号,主键
    USER_ID     VARCHAR2(10)   NOT NULL,             ---用户编号,外键,引用自用户表主键
    REAL_NAME   VARCHAR2(10)   NOT NULL,             ---收货人姓名
    TEL         VARCHAR2(20)   NOT NULL,             ---收货人电话
    ADDRESS     VARCHAR2(200)  NOT NULL,             ---收货人地址

);

CREATE TABLE DD_ORDER_DETAIL
(

    DETAIL_ID     VARCHAR2(10)   PRIMARY KEY NOT NULL,  ---自增编号,主键
    ORDER_ID      VARCHAR2(10)   NOT NULL,              ---订单编号,外键,引用自订单表主键
    PRODUCT_ID    VARCHAR2(10)   NOT NULL,              ---商品编号,外键,引用自商品表主键
    ORDER_TOTAL   NUMBER(5,0)    NOT NULL,              ---订单数量
    PRICE         NUMBER(10,2)   NOT NULL,              ---成交单价

);

// 生成订单表语句
String sql1 = "INSERT INTO DD_ORDER VALUES (ORDER_AUTOID.NEXTVAL,?,?,?,?)";

//生成订单详情表语句
String sql2 = "INSERT INTO DD_ORDER_DETAIL VALUES (DETAIL_AUTOID.NEXTVAL,?,?,?,?)";

由于订单表ORDER_ID是自增主键,我在java中执行完插入订单表操作后,应该如何写插入订单详情表的语句,使两者能通过ORDER_ID关联?(简言之,如何得到刚插入订单表的ORDER_ID)

阅读 4.2k
3 个回答

在一个事务里,你的订单没提交,订单详情理论上是获取不到订单id的。

很简单的办法,不用自增id作为订单号。也不建议用自增id作为订单号

举个栗子:你可以用UUID(保证订单号唯一性即可,同时最好有一定的业务含义),创建一个随机的UUID,同时插入到订单表和订单详情表就ok。关于订单号生成策略,网上很多,自行了解。

不建议自增id做订单号:

1. 暴露订单数量
2. 耦合度太高,且自增id没有任何业务意义
3. 在效率上也有一定劣势

ORDER_AUTOID.NEXTVAL 获取下一个序列值,即加上crement
ORDER_AUTOID.CURRVAL 获取当前序列值,即值不改变
但是进行第一次连接的时候,直接执行 ORDER_AUTOID.CURRVAL会报错, 提示无序列值,必须先执行下ORDER_AUTOID.NEXTVAL

换个思路,先获取sequence的下一个值,用这个值插入订单和订单明细表

SELECT ORDER_AUTOID.NEXTVAL FROM DUAL;

另外,oracle中没有自增字段,用sequence来替代;如果是mysql中auto increment属性的字段,可以通过statement.getGeneratedKeys()获取自增字段的值。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题