首页 > 解决方案 > 如何通过另一个表设置唯一键检查

问题描述

我创建了三个表supplieritempurchasesupplierid 与 table 有关系itemitemid 与 table 有关系purchase。我不想在同一项目itemid的桌子上插入。如何设置约束?purchasesupplier

CREATE TABLE csupplier(
  supid NUMBER(10) PRIMARY KEY ,
  supname VARCHAR2(30)
 );

CREATE TABLE ctitem(
  itemid NUMBER(10) PRIMARY KEY,
  itemname VARCHAR2(50),
  supid NUMBER(10)
 );
ALTER TABLE CTITEM
  ADD CONSTRAINT CTITEM_FK1 FOREIGN KEY(SUPID )REFERENCES CSUPPLIER(SUPID );
CREATE TABLE cPurchase(
  purchaseid NUMBER(10) PRIMARY KEY,
  itemid NUMBER(10),
  purchaseqty NUMBER(10)
 );
ALTER TABLE CPURCHASE
  ADD CONSTRAINT CPURCHASE_FK1 FOREIGN KEY(ITEMID )REFERENCES CTITEM(ITEMID )

标签: sqloracleconstraints

解决方案


您的问题有 2 个解决方案: 1. 更改表 cPurchase 并在表中添加 supid 列。并在此列上创建唯一键。这将解决您的问题。

CREATE TABLE cPurchase(
  purchaseid NUMBER(10) PRIMARY KEY,
  itemid NUMBER(10),
  purchaseqty NUMBER(10),
  supid NUMBER(10) UNIQUE KEY
 );
  1. 如果无法在此表上进行更改,请在插入/更新触发器之前写入行级别。在此触发器中编写逻辑以根据 Item_id citem 查找 Supid,然后他们会发现此供应商上的任何项目都存在于您的采购表中。

    CREATE [ OR REPLACE ] TRIGGER SUP_CHECK
    BEFORE INSERT
       ON cPurchase
       FOR EACH ROW 
    
    DECLARE
       L_COUNT NUMBER;
    
    BEGIN
      SELECT COUNT(*) INTO L_COUNT 
      FROM cPurchase c
      WHERE C.itemid in (Select itemid from ctitem ct where ct.supid = (Select supid 
       from ctitem  where itemid = :new.itemid)  );
    
    EXCEPTION
       WHEN ...
       -- exception handling
    
    END;
    

推荐阅读