Oracle SQL 检查存在约束
Posted
技术标签:
【中文标题】Oracle SQL 检查存在约束【英文标题】:Oracle SQL Check Exists Constraint 【发布时间】:2013-04-12 00:43:22 【问题描述】:我在 Oracle SQL Developer 中有两个简单的表(Train 和 Driver),每个表都有一个共同的属性(driverid)。本质上,我想要做的是不允许对驱动程序表中的特定驱动程序元组进行任何更新,如果它们的 driverid 属性存在于火车表中。我试图添加以下约束,但是它会抛出“此处不允许子查询”的错误。
alter table driver add constraint drivcheck CHECK
(NOT EXISTS(select driverid from train))
我做了一些挖掘,总体感觉是应该用触发器检查这种情况,所以我尝试创建一个触发器来完成这项工作,但没有取得很大成功。下面的触发器是我已经想出的。
create trigger drivcheck4
before update on driver
for each row
begin
declare
cursor dri is
select driverid from train where 'N' IN
(select availability
from driver
inner join train on driver.driverid=train.driverid
);
dri2 NUMBER;
begin
open dri;
loop
fetch dri into dri2;
exit when dri%NOTFOUND;
if check (exists (select * from dri2)) THEN
//Throw Error Section
else
//Allow update operation to take place
end if;
end loop;
close dri;
end;
我知道触发器执行的操作可能与描述的不同,但这只是我试验的结果。我最初的描述是我想要达到的目标。如果有人有任何想法,我将非常感激!
【问题讨论】:
驱动表中有哪些字段?如果将它们分配给火车,您是否要阻止所有这些更新? 这是两张表及其属性。 创建表 Driver(DriverID NUMBER(5) PRIMARY KEY, FName VARCHAR(20), LName VARCHAR(20), Address VARCHAR(30), DOB DATE, Tel_Num VARCHAR(11), Availability CHAR( 1) CONSTRAINT driverAvail Check (Availability='Y' OR Availability='N')) 创建表 Train(TrainID NUMBER(7) PRIMARY KEY, DriverID NUMBER(5), CoDriverID NUMBER(5), RouteID NUMBER(5), FOREIGN KEY (DriverID) REFERENCES Driver(DriverID), FOREIGN KEY (CoDriverID) REFERENCES Driver(DriverID), FOREIGN KEY (RouteID) REFERENCES Route(RouteID)) 如果 train 表中存在 driverid,则不允许对 driver 表中的该驱动程序记录进行任何操作。如果火车表中不存在他们的 id,那么应该可以对该司机记录进行操作 【参考方案1】:安德鲁,
您是否遇到任何错误?以下内容应该可以工作。如果您也可以发布一些示例数据,那将很容易测试。
create or replace trigger trg_bu_driver2
before update on driver
for each row
declare
l_cnt number;
begin
select count(*)
into l_cnt
from train
where driver_id = :new.driver_id;
if (l_cnt > 0) then
raise_application_error (-20001, 'new driver id exists in train table');
end if;
end trg_bu_driver2;
/
测试:
SQL> select * from driver;
DRIVER_ID COLUMN2
---------- --------------------
10 driver1
SQL> select * from train;
DRIVER_ID TRAIN_ID COLUMN3
---------- ---------- --------------------
20 100 train1
更新到火车表中不存在的司机 ID。
1 update driver
2 set driver_id = 30
3* where driver_id = 10
SQL> /
1 row updated.
No issues.
SQL> rollback;
Rollback complete.
--更新到存在于列车表中的驱动程序 ID,会引发错误。
SQL> update driver
2 set driver_id = 20
3 where driver_id = 10
4 ;
update driver
*
ERROR at line 1:
ORA-20001: new driver id exists in train table
ORA-06512: at "DMART_ETL.TRG_BU_DRIVER2", line 9
ORA-04088: error during execution of trigger 'DMART_ETL.TRG_BU_DRIVER2'
【讨论】:
谢谢。我已经在上面的 cmets 下放置了表创建脚本。至于样本数据,Train 表的示例为 (900000, 1, 2, 7, 87.2, 231.2),驱动程序表为 (1, John, Doe, Some Address, 14/09/88, 0011223344, N ) (2, John, Smith, Some Address, 10/12/85, 0012345667, N), (3, Johnny, Doey, Some Address, 1/1/91, 00145321456, Y)。 Andrew- 进行了一些语法更正。代码正在运行。确保您还检查您的触发器是否需要在插入上工作。此外,您可以编辑问题以发布 DDL 等,而不是在 cmets 中发布。祝你好运!以上是关于Oracle SQL 检查存在约束的主要内容,如果未能解决你的问题,请参考以下文章