--1. CREATE A TABLE WITH A FOREIGN KEY CONSTRAINT
CREATE TABLE DEPARTMENTS (
DEPARTMENT_ID NUMBER PRIMARY KEY,
DEPARTMENT_NAME VARCHAR2(100) NOT NULL
);
CREATE TABLE EMPLOYEES (
EMPLOYEE_ID NUMBER PRIMARY KEY,
FIRST_NAME VARCHAR2(50) NOT NULL,
LAST_NAME VARCHAR2(50) NOT NULL,
DEPARTMENT_ID NUMBER,
FOREIGN KEY (DEPARTMENT_ID) REFERENCES DEPARTMENTS(DEPARTMENT_ID)
);
--2. ADD A FOREIGN KEY CONSTRAINT TO AN EXISTING TABLE
ALTER TABLE EMPLOYEES
ADD CONSTRAINT FK_DEPARTMENT
FOREIGN KEY (DEPARTMENT_ID) REFERENCES DEPARTMENTS(DEPARTMENT_ID);
--3. CREATE A TABLE WITH MULTIPLE FOREIGN KEY CONSTRAINTS
CREATE TABLE ORDERS (
ORDER_ID NUMBER PRIMARY KEY,
CUSTOMER_ID NUMBER,
PRODUCT_ID NUMBER,
FOREIGN KEY (CUSTOMER_ID) REFERENCES CUSTOMERS(CUSTOMER_ID),
FOREIGN KEY (PRODUCT_ID) REFERENCES PRODUCTS(PRODUCT_ID)
);
--4. MODIFY AN EXISTING FOREIGN KEY CONSTRAINT
ALTER TABLE EMPLOYEES
DROP CONSTRAINT FK_DEPARTMENT;
ALTER TABLE EMPLOYEES
ADD CONSTRAINT FK_DEPARTMENT
FOREIGN KEY (DEPARTMENT_ID) REFERENCES DEPARTMENTS(DEPARTMENT_ID) ON DELETE CASCADE;
--5. DROP A FOREIGN KEY CONSTRAINT
ALTER TABLE EMPLOYEES
DROP CONSTRAINT FK_DEPARTMENT;
--6. CREATE A TABLE WITH A FOREIGN KEY AND ON DELETE SET NULL
CREATE TABLE PROJECTS (
PROJECT_ID NUMBER PRIMARY KEY,
PROJECT_NAME VARCHAR2(100) NOT NULL,
DEPARTMENT_ID NUMBER,
FOREIGN KEY (DEPARTMENT_ID) REFERENCES DEPARTMENTS(DEPARTMENT_ID) ON DELETE SET NULL
);
--7. ADD A FOREIGN KEY CONSTRAINT WITH A SPECIFIC NAME
ALTER TABLE ORDERS
ADD CONSTRAINT FK_CUSTOMER
FOREIGN KEY (CUSTOMER_ID) REFERENCES CUSTOMERS(CUSTOMER_ID);
--8. LIST ALL FOREIGN KEY CONSTRAINTS IN THE USERS SCHEMA
SELECT CONSTRAINT_NAME, TABLE_NAME
FROM USER_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'R'; -- R INDICATES A FOREIGN KEY CONSTRAINT
--9. GET COLUMNS OF A SPECIFIC FOREIGN KEY CONSTRAINT
SELECT COLUMN_NAME
FROM USER_CONS_COLUMNS
WHERE CONSTRAINT_NAME = 'FK_DEPARTMENT'; -- REPLACE WITH YOUR CONSTRAINT NAME
--10. QUERY ALL TABLES WITH FOREIGN KEY CONSTRAINTS
SELECT TABLE_NAME, CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'R';
--11. CHECK IF A COLUMN HAS A FOREIGN KEY CONSTRAINT
SELECT CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME = 'EMPLOYEES'
AND CONSTRAINT_TYPE = 'R';
--12. LIST COLUMNS WITH FOREIGN KEY CONSTRAINTS
SELECT COLUMN_NAME
FROM USER_CONS_COLUMNS
WHERE CONSTRAINT_NAME IN (
SELECT CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'R'
);
--13. ENABLE A FOREIGN KEY CONSTRAINT
ALTER TABLE EMPLOYEES
ENABLE CONSTRAINT FK_DEPARTMENT;
--14. DISABLE A FOREIGN KEY CONSTRAINT
ALTER TABLE EMPLOYEES
DISABLE CONSTRAINT FK_DEPARTMENT;
--15. VALIDATE A FOREIGN KEY CONSTRAINT
ALTER TABLE EMPLOYEES
ENABLE VALIDATE CONSTRAINT FK_DEPARTMENT;
--16. ADD A FOREIGN KEY CONSTRAINT WITH ON DELETE CASCADE
ALTER TABLE ORDER_ITEMS
ADD CONSTRAINT FK_ORDER
FOREIGN KEY (ORDER_ID) REFERENCES ORDERS(ORDER_ID) ON DELETE CASCADE;
--17. CHECK FOR VIOLATIONS BEFORE ADDING A FOREIGN KEY CONSTRAINT
SELECT *
FROM EMPLOYEES
WHERE DEPARTMENT_ID NOT IN (SELECT DEPARTMENT_ID FROM DEPARTMENTS);
--18. CREATE A VIEW SHOWING FOREIGN KEY CONSTRAINTS
CREATE VIEW FK_CONSTRAINTS AS
SELECT TABLE_NAME, CONSTRAINT_NAME, R_CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'R';
--19. COUNT THE NUMBER OF FOREIGN KEY CONSTRAINTS IN A TABLE
SELECT COUNT(*)
FROM USER_CONSTRAINTS
WHERE TABLE_NAME = 'EMPLOYEES' AND CONSTRAINT_TYPE = 'R';
--20. GET DDL FOR FOREIGN KEY CONSTRAINTS
SELECT DBMS_METADATA.GET_DDL('CONSTRAINT', CONSTRAINT_NAME)
FROM USER_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'R';
--21. LIST FOREIGN KEY CONSTRAINTS WITH CREATION DATES
SELECT CONSTRAINT_NAME, TABLE_NAME, CREATED
FROM USER_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'R'
ORDER BY CREATED;
--22. INSERT DATA THAT VIOLATES A FOREIGN KEY CONSTRAINT
INSERT INTO EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, DEPARTMENT_ID)
VALUES (1, 'JOHN', 'DOE', 999); -- THIS WILL FAIL IF 999 IS NOT A VALID DEPARTMENT_ID
--23. UPDATE A COLUMN TO AVOID FOREIGN KEY CONSTRAINT VIOLATION
UPDATE EMPLOYEES
SET DEPARTMENT_ID = 10
WHERE EMPLOYEE_ID = 1;
--24. DELETE RECORDS THAT CAUSE FOREIGN KEY CONSTRAINT VIOLATIONS
DELETE FROM EMPLOYEES
WHERE DEPARTMENT_ID = 999; -- ENSURE THE FOREIGN KEY IS MAINTAINED
--25. LIST ALL CONSTRAINTS FOR A TABLE
SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE
FROM USER_CONSTRAINTS
WHERE TABLE_NAME = 'EMPLOYEES';
--26. GET INFORMATION ABOUT FOREIGN KEY CONSTRAINTS
SELECT *
FROM USER_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'R';
--27. LIST TABLES WITH NO FOREIGN KEY CONSTRAINTS
SELECT TABLE_NAME
FROM USER_TABLES
WHERE TABLE_NAME NOT IN (
SELECT TABLE_NAME
FROM USER_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'R'
);
--28. DROP ALL FOREIGN KEY CONSTRAINTS IN A TABLE
BEGIN
FOR REC IN (SELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'EMPLOYEES' AND CONSTRAINT_TYPE = 'R') LOOP
EXECUTE IMMEDIATE 'ALTER TABLE EMPLOYEES DROP CONSTRAINT ' || REC.CONSTRAINT_NAME;
END LOOP;
END;
--29. ENABLE ALL FOREIGN KEY CONSTRAINTS IN A TABLE
BEGIN
FOR REC IN (SELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'EMPLOYEES' AND CONSTRAINT_TYPE = 'R') LOOP
EXECUTE IMMEDIATE 'ALTER TABLE EMPLOYEES ENABLE CONSTRAINT ' || REC.CONSTRAINT_NAME;
END LOOP;
END;
--30. CHECK FOREIGN KEY CONSTRAINT VIOLATIONS IN A REPORT FORMAT
SELECT EMPLOYEE_ID, DEPARTMENT_ID
FROM EMPLOYEES
WHERE DEPARTMENT_ID NOT IN (SELECT DEPARTMENT_ID FROM DEPARTMENTS);
--31. CREATE A SUMMARY OF TABLES WITH FOREIGN KEY CONSTRAINTS
SELECT TABLE_NAME, COUNT(*) AS FK_COUNT
FROM USER_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'R'
GROUP BY TABLE_NAME;
--32. CHECK FOR FOREIGN KEY CONSTRAINTS ON SPECIFIC COLUMNS
SELECT CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME = 'EMPLOYEES'
AND R_CONSTRAINT_NAME = 'FK_DEPARTMENT'; -- REPLACE WITH YOUR CONSTRAINT NAME
--33. ADD A COMMENT TO A FOREIGN KEY CONSTRAINT
COMMENT ON CONSTRAINT FK_DEPARTMENT IS 'FOREIGN KEY TO DEPARTMENTS TABLE';
--34. GET FOREIGN KEY CONSTRAINTS WITH SPECIFIC PATTERNS
SELECT CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'R' AND CONSTRAINT_NAME LIKE 'FK_%';
--35. COUNT FOREIGN KEY CONSTRAINTS BY TABLE
SELECT TABLE_NAME, COUNT(*) AS FK_COUNT
FROM USER_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'R'
GROUP BY TABLE_NAME;
--36. VIEW FOREIGN KEY CONSTRAINTS WITH RELATED COLUMNS
SELECT A.TABLE_NAME, B.COLUMN_NAME
FROM USER_CONSTRAINTS A
JOIN USER_CONS_COLUMNS B ON A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
WHERE A.CONSTRAINT_TYPE = 'R';
--37. GET UNIQUE VALUES FROM A COLUMN WITH A FOREIGN KEY CONSTRAINT
SELECT DISTINCT DEPARTMENT_ID
FROM EMPLOYEES
WHERE DEPARTMENT_ID IS NOT NULL;
--38. CREATE A TABLE WITH FOREIGN KEY CONSTRAINTS AND COMPOSITE KEYS
CREATE TABLE ORDER_ITEMS (
ORDER_ITEM_ID NUMBER PRIMARY KEY,
ORDER_ID NUMBER,
PRODUCT_ID NUMBER,
FOREIGN KEY (ORDER_ID) REFERENCES ORDERS(ORDER_ID),
FOREIGN KEY (PRODUCT_ID) REFERENCES PRODUCTS(PRODUCT_ID)
);
--39. CHECK FOR CONSTRAINT VIOLATIONS ACROSS ALL FOREIGN KEY CONSTRAINTS
SELECT *
FROM EMPLOYEES
WHERE DEPARTMENT_ID NOT IN (SELECT DEPARTMENT_ID FROM DEPARTMENTS);
--40. UPDATE TABLE TO ADD A FOREIGN KEY CONSTRAINT AFTER DATA CLEANUP
DELETE FROM EMPLOYEES WHERE DEPARTMENT_ID NOT IN (SELECT DEPARTMENT_ID FROM DEPARTMENTS);
ALTER TABLE EMPLOYEES
ADD CONSTRAINT FK_DEPARTMENT FOREIGN KEY (DEPARTMENT_ID) REFERENCES DEPARTMENTS(DEPARTMENT_ID);
--41. CREATE A TRIGGER TO ENFORCE BUSINESS RULES WITH FOREIGN KEY LOGIC
CREATE OR REPLACE TRIGGER TRG_CHECK_FK_DEPARTMENT
BEFORE INSERT OR UPDATE ON EMPLOYEES
FOR EACH ROW
BEGIN
IF :NEW.DEPARTMENT_ID IS NOT NULL AND NOT EXISTS (SELECT 1 FROM DEPARTMENTS WHERE DEPARTMENT_ID = :NEW.DEPARTMENT_ID) THEN
RAISE_APPLICATION_ERROR(-20001, 'DEPARTMENT DOES NOT EXIST.');
END IF;
END;
--42. GENERATE DDL FOR FOREIGN KEY CONSTRAINTS
SELECT DBMS_METADATA.GET_DDL('CONSTRAINT', CONSTRAINT_NAME)
FROM USER_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'R';
--43. LIST FOREIGN KEY CONSTRAINTS WITH A SPECIFIC COLUMN NAME
SELECT CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE R_CONSTRAINT_NAME IN (
SELECT CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE SEARCH_CONDITION LIKE '%DEPARTMENT_ID%'
);
--44. CHECK FOREIGN KEY CONSTRAINT VIOLATIONS BEFORE UPDATE
SELECT *
FROM EMPLOYEES
WHERE EMPLOYEE_ID = 1 AND DEPARTMENT_ID NOT IN (SELECT DEPARTMENT_ID FROM DEPARTMENTS); -- UPDATE CHECK
--45. IDENTIFY FOREIGN KEY CONSTRAINTS AND THEIR RELATED COLUMNS
SELECT A.TABLE_NAME, B.COLUMN_NAME
FROM USER_CONSTRAINTS A
JOIN USER_CONS_COLUMNS B ON A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
WHERE A.CONSTRAINT_TYPE = 'R';
--46. GET COLUMN METADATA FOR COLUMNS WITH FOREIGN KEY CONSTRAINTS
SELECT *
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'EMPLOYEES' AND COLUMN_NAME IN (
SELECT COLUMN_NAME
FROM USER_CONS_COLUMNS
WHERE CONSTRAINT_NAME IN (
SELECT CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'R'
)
);
--47. CREATE A TEMPORARY TABLE WITH FOREIGN KEY CONSTRAINTS
CREATE GLOBAL TEMPORARY TABLE TEMP_ORDERS (
ORDER_ID NUMBER NOT NULL,
CUSTOMER_ID NUMBER,
FOREIGN KEY (CUSTOMER_ID) REFERENCES CUSTOMERS(CUSTOMER_ID)
) ON COMMIT PRESERVE ROWS;
--48. GET INFORMATION ABOUT FOREIGN KEY CONSTRAINTS WITH SPECIFIC CONDITIONS
SELECT A.CONSTRAINT_NAME, A.TABLE_NAME, A.R_CONSTRAINT_NAME
FROM USER_CONSTRAINTS A
WHERE A.CONSTRAINT_TYPE = 'R' AND A.R_CONSTRAINT_NAME = 'FK_CUSTOMER'; -- REPLACE WITH YOUR CONSTRAINT NAME
--49. CREATE A PROCEDURE TO ADD FOREIGN KEY CONSTRAINTS DYNAMICALLY
CREATE OR REPLACE PROCEDURE ADD_FOREIGN_KEY_CONSTRAINT(P_TABLE_NAME IN VARCHAR2, P_COLUMN_NAME IN VARCHAR2, P_REF_TABLE IN VARCHAR2, P_REF_COLUMN IN VARCHAR2) AS
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE ' || P_TABLE_NAME || ' ADD CONSTRAINT FK_' || P_COLUMN_NAME || ' FOREIGN KEY (' || P_COLUMN_NAME || ') REFERENCES ' || P_REF_TABLE || '(' || P_REF_COLUMN || ')';
END;
--50. IDENTIFY TABLES WITH NO FOREIGN KEY CONSTRAINTS
SELECT TABLE_NAME
FROM USER_TABLES
WHERE TABLE_NAME NOT IN (
SELECT TABLE_NAME
FROM USER_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'R'
);
No comments:
Post a Comment