鍍金池/ 問答/Java  數(shù)據(jù)庫/ oracle 訂單表主鍵為自增主鍵,如何動(dòng)態(tài)的和訂單詳情表關(guān)聯(lián)?

oracle 訂單表主鍵為自增主鍵,如何動(dòng)態(tài)的和訂單詳情表關(guān)聯(lián)?

----訂單表
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,              ---訂單數(shù)量
    PRICE         NUMBER(10,2)   NOT NULL,              ---成交單價(jià)

);

// 生成訂單表語句
String sql1 = "INSERT INTO DD_ORDER VALUES (ORDER_AUTOID.NEXTVAL,?,?,?,?)";

//生成訂單詳情表語句
String sql2 = "INSERT INTO DD_ORDER_DETAIL VALUES (DETAIL_AUTOID.NEXTVAL,?,?,?,?)";

由于訂單表ORDER_ID是自增主鍵,我在java中執(zhí)行完插入訂單表操作后,應(yīng)該如何寫插入訂單詳情表的語句,使兩者能通過ORDER_ID關(guān)聯(lián)?(簡言之,如何得到剛插入訂單表的ORDER_ID)

回答
編輯回答
喵小咪

ORDER_AUTOID.NEXTVAL 獲取下一個(gè)序列值,即加上crement
ORDER_AUTOID.CURRVAL 獲取當(dāng)前序列值,即值不改變
但是進(jìn)行第一次連接的時(shí)候,直接執(zhí)行 ORDER_AUTOID.CURRVAL會(huì)報(bào)錯(cuò), 提示無序列值,必須先執(zhí)行下ORDER_AUTOID.NEXTVAL

2017年4月6日 01:39
編輯回答
好難瘦

在一個(gè)事務(wù)里,你的訂單沒提交,訂單詳情理論上是獲取不到訂單id的。

很簡單的辦法,不用自增id作為訂單號。也不建議用自增id作為訂單號

舉個(gè)栗子:你可以用UUID(保證訂單號唯一性即可,同時(shí)最好有一定的業(yè)務(wù)含義),創(chuàng)建一個(gè)隨機(jī)的UUID,同時(shí)插入到訂單表和訂單詳情表就ok。關(guān)于訂單號生成策略,網(wǎng)上很多,自行了解。

不建議自增id做訂單號:

1. 暴露訂單數(shù)量
2. 耦合度太高,且自增id沒有任何業(yè)務(wù)意義
3. 在效率上也有一定劣勢
2017年11月23日 15:45
編輯回答
夢若殤

換個(gè)思路,先獲取sequence的下一個(gè)值,用這個(gè)值插入訂單和訂單明細(xì)表

SELECT ORDER_AUTOID.NEXTVAL FROM DUAL;

另外,oracle中沒有自增字段,用sequence來替代;如果是mysql中auto increment屬性的字段,可以通過statement.getGeneratedKeys()獲取自增字段的值。

2018年7月15日 16:17