我希望用一些資料填充表格,通常我會運行一些插入腳本或通過 csv 檔案上傳。我的要求是,只要 order_id 在 orders 表中,資料就只能填充到第二個表中。
據我所知,在運行插入腳本之前,我可能需要撰寫一些 PL/SQL 代碼來檢查 order_id 是否存在于訂單表中,但不確定如何撰寫。如果有人能讓我開始,我將不勝感激。
這是訂單表的創建陳述句:
CREATE TABLE ORDERS (
ORDER_ID NUMBER NOT NULL,
STATUS VARCHAR2(9) NOT NULL,
ORDER_DATE DATE NOT NULL,
PRIMARY KEY(ORDER_ID),
CONSTRAINT CHK_STATUS CHECK (STATUS = 'OPEN' OR STATUS = 'CLOSED')
);
第二個表的創建陳述句是:
CREATE TABLE ORDER2
(
ORDER_ID NUMBER NOT NULL,
PRODUCT_ID NUMBER NOT NULL,
ORDER_DATE DATE NOT NULL,
PRIMARY KEY(PRODUCT_ID)
);
謝謝。
uj5u.com熱心網友回復:
嗯,是的,你可以手動檢查。正如 HoneyBadger 評論的那樣,exists這是一種方法,例如:
SQL> insert into orders (order_id, status, order_date)
2 select 1, 'OPEN' , trunc(sysdate - 2) from dual union all
3 select 2, 'CLOSED', trunc(sysdate - 1) from dual;
2 rows created.
SQL> select * from orders;
ORDER_ID STATUS ORDER_DATE
---------- ------ ----------
1 OPEN 03.06.2022
2 CLOSED 04.06.2022
讓我們嘗試order_id = 1插入order2:
SQL> insert into order2 (product_id, order_id, order_date)
2 select 100, 1, trunc(sysdate - 2) from dual
3 where exists (select null
4 from orders
5 where order_id = 1);
1 row created.
它成功地order_id = 1存在于orders表中。哪個order_id = 3不存在呢?
SQL> insert into order2 (product_id, order_id, order_date)
2 select 300, 3, trunc(sysdate) from dual
3 where exists (select null
4 from orders
5 where order_id = 3);
0 rows created.
SQL>
對了,沒有插入任何東西。
但是,你為什么不讓資料庫為你做呢?創建一個外鍵約束order2,除非表中order_id存在,否則不允許將任何行插入orders表中:
SQL> create table orders (
2 order_id number constraint pk_ord primary key,
3 status varchar2(6) constraint chk_ord_stat check (status in ('OPEN', 'CLOSED'))
4 not null,
5 order_date date not null
6 );
Table created.
SQL> create table order2 (
2 product_id number constraint pk_ord2 primary key,
3 order_id number constraint fk_ord2_ord references orders (order_id)
4 not null,
5 order_date date not null
6 );
Table created.
SQL>
測驗:
SQL> insert into order2 (product_id, order_id, order_date)
2 values (300, 3, trunc(sysdate));
insert into order2 (product_id, order_id, order_date)
*
ERROR at line 1:
ORA-02291: integrity constraint (SCOTT.FK_ORD2_ORD) violated - parent key not
found
SQL>
看?Oracle 不會讓你這樣做,你不必檢查任何東西。
另一方面,為什么要兩張桌子?大多數列都是通用的(我認為它們也共享通用資料),所以也許你可以添加到訂單中product_id(不過我不知道是否設定主鍵):order_idproduct_id
SQL> create table orders (
2 order_id number,
3 product_id number,
4 status varchar2(6) constraint chk_ord_stat check (status in ('OPEN', 'CLOSED'))
5 not null,
6 order_date date not null,
7 --
8 constraint pk_ord primary key (order_id, product_id)
9 );
Table created.
SQL>
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/486116.html
