Oracle SQL,条件外键

devPash

我在实施数据库时遇到问题。我有2张桌子:

 CREATE TABLE TAB1
 (
    TAB1_ID INT NOT NULL PRIMARY KEY,
    TAB1_BOOL VARCHAR(4) NOT NULL CHECK (TAB1_BOOL IN('OPT1', 'OPT2'))
 );
 CREATE TABLE TAB2
 (
   TAB2_ID INT NOT NULL
 );

我想将TAB2_ID作为TAB1_ID的外键,但是TAB2_ID只能是这些TAB1_ID,在表TAB1中的行用TAB1_BOOL == OPT1标记​​。例如:

TAB1 contains 2 rows: 
1. 'TAB1_ID==1' 'TAB1_BOOL==OPT1', 
2. 'TAB1_ID==2' 'TAB1_BOOL==OPT2'.
Now, statement like:
INSERT INTO TAB2 (TAB2_ID) VALUES (2);
should be rejected because row with TAB1_ID==2 is marked with OPT2

是否可以在Oracle SQL中做到这一点?

特里蒙

这可以通过使用触发器来实现:

 CREATE TABLE TAB1 (
    TAB1_ID INT NOT NULL PRIMARY KEY,
    TAB1_BOOL VARCHAR(4) NOT NULL CHECK (TAB1_BOOL IN('OPT1', 'OPT2'))
 );

 CREATE TABLE TAB2 (
   TAB2_ID INT NOT NULL,
   FOREIGN KEY (TAB2_ID) REFERENCES TAB1 (TAB1_ID)
 );

CREATE OR REPLACE TRIGGER CHECK_TAB2_ID
    BEFORE UPDATE OR INSERT ON TAB2 FOR EACH ROW
DECLARE 
    CURSOR CHECK_CURSOR IS
        SELECT TAB1_BOOL
          FROM TAB1 
         WHERE TAB1_ID = :new.TAB2_id;
    V_TAB1_BOOL VARCHAR(4);
BEGIN
    OPEN CHECK_CURSOR;
    FETCH CHECK_CURSOR INTO V_TAB1_BOOL;
    IF (V_TAB1_BOOL <> 'OPT1') THEN
       CLOSE CHECK_CURSOR;
       raise_application_error(10000, 'Wrong value in TAB1');
    END IF;
    CLOSE CHECK_CURSOR;
END;

INSERT INTO TAB1 VALUES (1, 'OPT1');
INSERT INTO TAB1 VALUES (2, 'OPT2');

INSERT INTO TAB2 (TAB2_ID) VALUES (1);

上面的触发器中仍然存在一个小错误。我目前无法访问Oracle数据库,因此我很难修复它。这是我的小提琴

ps:好的,;小提琴里只有一个-这是一个更新。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

外键的SQL(Oracle)问题

来自分类Dev

使用SQL / ORACLE的外键

来自分类Dev

sql中的外键:Oracle

来自分类Dev

外键--SQL--Oracle

来自分类Dev

Oracle SQL Developer-使用外键

来自分类Dev

ORACLE SQL - 基于外键的查询

来自分类Dev

Oracle SQL 添加额外的外键

来自分类Dev

Oracle SQL条件连接

来自分类Dev

Oracle-插入存储过程外键

来自分类Dev

如何在子表ORACLE SQL中分配两个外键?

来自分类Dev

SQL条件选择Oracle sql

来自分类Dev

SQL Server:使用条件创建外键

来自分类Dev

基于条件的Oracle SQL计数

来自分类Dev

Oracle SQL Where条件权重

来自分类Dev

Oracle PL / SQL条件声明?

来自分类Dev

如果条件在Oracle SQL中

来自分类Dev

Oracle SQL中的条件分组

来自分类Dev

SQL 中的 WHERE 条件 (ORACLE)

来自分类Dev

Oracle SQL - 加入子条件

来自分类Dev

查询不适用于外键作为另一个表Oracle SQL的组合主键

来自分类Dev

SQL外键外键

来自分类Dev

删除没有名称的外键Oracle

来自分类Dev

Hibernate无法在Oracle中的不同架构之间创建外键

来自分类Dev

基于外键的增量字段(JPA,Hibernate,Oracle DB)

来自分类Dev

oracle:推迟外键检查不起作用

来自分类Dev

Oracle Statement的性能:检索主键(包括组合的外键)

来自分类Dev

Oracle删除可能违反要添加的外键的数据

来自分类Dev

外键约束在Oracle中不起作用

来自分类Dev

基于外键的增量字段(JPA,Hibernate,Oracle DB)