CREATE TABLE order-detail
(order_id Number Constraint
fk_oid REFERENCES scott.order(order_id),
(part_no Number Constraint
fk_pno REFERENCES part(part_no),
(quantity Number Constraint nn_qty Not NULL
Constraint check_qty_low CHECK (quantity > 0),
(cost Number Constraint
check_cost CHECK (cost>0),
(Constraint pk_od PRIMARY KEY (order_id, part_no))
With the specification of a table attribute
CONSTRAINT name REFERENCES table(attribute) [ON DELETE CASCADE]
In a Constraint Row
CONSTRAINT name FOREIGN KEY (attribute1) REFERENCES table(attribute) [ON DELETE CASCADE]
The ON DELETE CASCADE clause tells Oracle to delete the child tables when the corresponding parent table row is deleted. If the ON DELETE CASCADE clause is left off, Oracle will not allow the deletion of a parent row unless all the child rows are deleted first.
Oracle supports update restrict, delete restrict and delete cascade. It does not easily support:
CREATE TABLE dept
(deptno NUMBER(2)
CONSTRAINT pk_dept PRIMARY KEY
CONSTRAINT ck_deptno
CHECK (deptno BETWEEN 10 and 99),
dname VARCHAR2(9)
CONSTRAINT ck_dname CHECK (dname=UPPER(dname))
loc VARCHAR2(10)
CONSTRAINT ck_loc CHECK (loc IN
(`DALLAS','BOSTON','CHICAGO')))
CREATE TABLE emp
(empno NUMBER(4) CONSTRAINT pk_emp PRIMARY KEY,
ename VARCHAR2(10),
job VARCHAR2(9),
hiredate DATE,
sal NUMBER(7,2)
comm NUMBER(7,2),
deptno NUMBER(2),
CONSTRAINT fk_deptno FOREIGN KEY (deptno)
REFERENCES dept(deptno),
CONSTRAINT ck_total CHECK (sal + comm <=5000))
CREATE TRIGGER emp_permit_changes
BEFORE
DELETE or INSERT or UPDATE
ON emp
DECLARE
dummy INTEGER;
BEGIN
/* If today is a Saturday or Sunday, then error.*/
IF (TO_CHAR(SYSDATE, `DY') = `SAT' OR
(TO_CHAR(SYSDATE, `DY') = `SUN')
THEN raise_application_error(-2051,
`May not change on weekend');
END IF;
/* Check holiday */
SELECT COUNT (*)
INTO dummy
FROM company_holidays
WHERE day = TRUNC(SYSDATE);
IF dummy > 0
THEN raise_application_error(-20501,
`May not change on holiday');
END IF;
END;
CREATE TRIGGER salary_check
BEFORE
INSERT OR UPDATE OF sal, job
ON emp
FOR EACH ROW
WHEN (new.job<>`PRESIDENT')
DECLARE
minsal NUMBER;
maxsal NUMBER;
BEGIN
/*Get the min and max salary from table*/
SELECT minsal, maxsal
INTO minsal, maxsal
FROM sal_guide
WHERE job = :new.job;
/*Check for Error*/
IF (:new.salmaxsal)
THEN raise_application_error(-20601, `Salary
out of range for job')
END IF;
END;