sql - 如何通过另一个表设置唯一键检查
问题描述
我创建了三个表supplier
:item
和purchase
。supplier
id 与 table 有关系item
,item
id 与 table 有关系purchase
。我不想在同一项目itemid
的桌子上插入。如何设置约束?purchase
supplier
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 )
解决方案
您的问题有 2 个解决方案: 1. 更改表 cPurchase 并在表中添加 supid 列。并在此列上创建唯一键。这将解决您的问题。
CREATE TABLE cPurchase(
purchaseid NUMBER(10) PRIMARY KEY,
itemid NUMBER(10),
purchaseqty NUMBER(10),
supid NUMBER(10) UNIQUE KEY
);
如果无法在此表上进行更改,请在插入/更新触发器之前写入行级别。在此触发器中编写逻辑以根据 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;
推荐阅读
- django - 将用户定义的过滤器存储在数据库中
- javascript - 反应原生 mapbox getCenter 不工作
- ruby-on-rails - 我可以在 Rails 系统测试中使用 RSpec 的#scenario 吗?
- mongodb - 为什么流星数据库(mongo db)的内容没有上传到 github 存储库中?
- c - 如果条件为假,则无操作的函数式宏
- ruby - Ruby 嵌套哈希合并
- angular - 如何将 viewRef 从一个 viewContainerRef 克隆到另一个 viewContainerRef?
- html - 基于锚文本的“a”元素的XPath?
- f# - 等效于 F# 中的 C# async main
- wpf - 从另一个窗口填充列表框,但在第二次尝试时,列表被替换而不是添加