Creating Tables with Constraints
===========================================
-- 1. Create table with PRIMARY KEY
CREATE TABLE employees (
emp_id NUMBER PRIMARY KEY,
emp_name VARCHAR2(50)
);
-- 2. Create table with NOT NULL constraint
CREATE TABLE departments (
dept_id NUMBER,
dept_name VARCHAR2(50) NOT NULL
);
-- 3. Create table with UNIQUE constraint
CREATE TABLE projects (
proj_id NUMBER,
proj_name VARCHAR2(100) UNIQUE
);
-- 4. Create table with CHECK constraint
CREATE TABLE products (
product_id NUMBER,
price NUMBER CHECK (price > 0)
);
-- 5. Create table with FOREIGN KEY constraint
CREATE TABLE orders (
order_id NUMBER PRIMARY KEY,
cust_id NUMBER,
CONSTRAINT fk_customer FOREIGN KEY (cust_id) REFERENCES customers(customer_id)
);
-- 6. Create table with composite PRIMARY KEY
CREATE TABLE employee_projects (
emp_id NUMBER,
proj_id NUMBER,
PRIMARY KEY (emp_id, proj_id)
);
-- 7. Create table with multiple constraints inline
CREATE TABLE vendors (
vendor_id NUMBER CONSTRAINT pk_vendor PRIMARY KEY,
vendor_name VARCHAR2(100) CONSTRAINT unq_vendor_name UNIQUE NOT NULL,
rating NUMBER CONSTRAINT chk_rating CHECK (rating BETWEEN 1 AND 5)
);
-- 8. Create table with named NOT NULL constraint
CREATE TABLE locations (
loc_id NUMBER CONSTRAINT nn_loc_id NOT NULL,
loc_name VARCHAR2(50)
);
-- 9. Create table with foreign key referencing composite key
CREATE TABLE employee_tasks (
emp_id NUMBER,
task_id NUMBER,
CONSTRAINT fk_emp_proj FOREIGN KEY (emp_id, task_id) REFERENCES employee_projects(emp_id, proj_id)
);
-- 10. Create table with default value and check constraint
CREATE TABLE accounts (
acc_id NUMBER PRIMARY KEY,
balance NUMBER DEFAULT 0 CHECK (balance >= 0)
);
Adding Constraints to Existing Tables
===========================================
-- 11. Add PRIMARY KEY constraint
ALTER TABLE employees ADD CONSTRAINT pk_emp PRIMARY KEY (emp_id);
-- 12. Add UNIQUE constraint
ALTER TABLE employees ADD CONSTRAINT unq_emp_name UNIQUE (emp_name);
-- 13. Add NOT NULL constraint
ALTER TABLE departments MODIFY dept_name NOT NULL;
-- 14. Add CHECK constraint
ALTER TABLE products ADD CONSTRAINT chk_price CHECK (price > 0);
-- 15. Add FOREIGN KEY constraint
ALTER TABLE orders ADD CONSTRAINT fk_cust FOREIGN KEY (cust_id) REFERENCES customers(customer_id);
-- 16. Add composite UNIQUE constraint
ALTER TABLE employee_projects ADD CONSTRAINT unq_emp_proj UNIQUE (emp_id, proj_id);
-- 17. Add CHECK constraint with complex condition
ALTER TABLE employees ADD CONSTRAINT chk_salary CHECK (salary BETWEEN 1000 AND 10000);
-- 18. Add NOT NULL to a column (using MODIFY)
ALTER TABLE vendors MODIFY vendor_name NOT NULL;
-- 19. Add FOREIGN KEY with ON DELETE CASCADE
ALTER TABLE orders ADD CONSTRAINT fk_cust_del FOREIGN KEY (cust_id) REFERENCES customers(customer_id) ON DELETE CASCADE;
-- 20. Add CHECK constraint for email format
ALTER TABLE employees ADD CONSTRAINT chk_email CHECK (email LIKE '%_@__%.__%');
Dropping Constraints
===========================================
-- 21. Drop PRIMARY KEY
ALTER TABLE employees DROP CONSTRAINT pk_emp;
-- 22. Drop UNIQUE constraint
ALTER TABLE employees DROP CONSTRAINT unq_emp_name;
-- 23. Drop CHECK constraint
ALTER TABLE products DROP CONSTRAINT chk_price;
-- 24. Drop FOREIGN KEY constraint
ALTER TABLE orders DROP CONSTRAINT fk_cust;
-- 25. Drop NOT NULL constraint (by modifying column)
ALTER TABLE departments MODIFY dept_name NULL;
-- 26. Drop composite UNIQUE constraint
ALTER TABLE employee_projects DROP CONSTRAINT unq_emp_proj;
-- 27. Drop CHECK constraint with complex condition
ALTER TABLE employees DROP CONSTRAINT chk_salary;
-- 28. Drop FOREIGN KEY with ON DELETE CASCADE
ALTER TABLE orders DROP CONSTRAINT fk_cust_del;
-- 29. Drop NOT NULL constraint on vendor_name
ALTER TABLE vendors MODIFY vendor_name NULL;
-- 30. Drop CHECK constraint for email format
ALTER TABLE employees DROP CONSTRAINT chk_email;
Constraint Queries and Information
===========================================
-- 31. List all constraints on a table
SELECT constraint_name, constraint_type FROM user_constraints WHERE table_name = 'EMPLOYEES';
-- 32. Find columns involved in a constraint
SELECT constraint_name, column_name FROM user_cons_columns WHERE constraint_name = 'PK_EMP';
-- 33. Find all tables with primary keys
SELECT table_name FROM user_constraints WHERE constraint_type = 'P';
-- 34. Find foreign keys referencing a table
SELECT constraint_name, table_name FROM user_constraints WHERE r_constraint_name = 'PK_CUSTOMERS';
-- 35. Check if a column is NOT NULL
SELECT column_name, nullable FROM user_tab_columns WHERE table_name = 'DEPARTMENTS' AND column_name = 'DEPT_NAME';
-- 36. Check all CHECK constraints
SELECT constraint_name, search_condition FROM user_constraints WHERE constraint_type = 'C';
-- 37. Check all UNIQUE constraints
SELECT constraint_name, table_name FROM user_constraints WHERE constraint_type = 'U';
-- 38. Find all foreign keys for a table
SELECT constraint_name, r_constraint_name FROM user_constraints WHERE table_name = 'ORDERS' AND constraint_type = 'R';
-- 39. Get all constraints created by user
SELECT constraint_name, constraint_type, table_name FROM user_constraints;
-- 40. Show constraint status (enabled/disabled)
SELECT constraint_name, status FROM user_constraints WHERE table_name = 'EMPLOYEES';
Creating Constraints with Specific Options
===========================================
-- 41. Add foreign key with ON DELETE SET NULL
ALTER TABLE orders ADD CONSTRAINT fk_cust_setnull FOREIGN KEY (cust_id) REFERENCES customers(customer_id) ON DELETE SET NULL;
-- 42. Create deferrable constraint
ALTER TABLE employees ADD CONSTRAINT fk_dept FOREIGN KEY (dept_id) REFERENCES departments(dept_id) DEFERRABLE INITIALLY DEFERRED;
-- 43. Disable a constraint
ALTER TABLE employees DISABLE CONSTRAINT fk_dept;
-- 44. Enable a constraint
ALTER TABLE employees ENABLE CONSTRAINT fk_dept;
-- 45. Create unique constraint using index
CREATE UNIQUE INDEX unq_idx_emp_name ON employees(emp_name);
ALTER TABLE employees ADD CONSTRAINT unq_emp_name UNIQUE USING INDEX unq_idx_emp_name;
-- 46. Create check constraint for allowed statuses
ALTER TABLE orders ADD CONSTRAINT chk_status CHECK (status IN ('OPEN', 'CLOSED', 'PENDING'));
-- 47. Add primary key using constraint name
ALTER TABLE products ADD CONSTRAINT pk_product PRIMARY KEY (product_id);
-- 48. Create NOT NULL constraint with name on existing column
ALTER TABLE departments MODIFY dept_name CONSTRAINT nn_dept_name NOT NULL;
-- 49. Create foreign key referencing self (hierarchy)
ALTER TABLE employees ADD CONSTRAINT fk_mgr FOREIGN KEY (manager_id) REFERENCES employees(emp_id);
-- 50. Create check constraint with multiple columns
ALTER TABLE employee_projects ADD CONSTRAINT chk_proj_date CHECK (start_date < end_date);
Advanced Constraint Examples
===========================================
-- 51. Add unique constraint with function-based index
CREATE UNIQUE INDEX unq_upper_emp_name ON employees(UPPER(emp_name));
ALTER TABLE employees ADD CONSTRAINT unq_emp_name_unique UNIQUE USING INDEX unq_upper_emp_name;
-- 52. Create check constraint for positive integer IDs
ALTER TABLE products ADD CONSTRAINT chk_prod_id CHECK (product_id > 0);
-- 53. Create NOT NULL constraint on multiple columns
ALTER TABLE employees MODIFY (emp_name NOT NULL, email NOT NULL);
-- 54. Add foreign key with DEFERRABLE INITIALLY IMMEDIATE
ALTER TABLE orders ADD CONSTRAINT fk_cust DEFERRABLE INITIALLY IMMEDIATE FOREIGN KEY (cust_id) REFERENCES customers(customer_id);
-- 55. Add check constraint to ensure email contains '@'
ALTER TABLE employees ADD CONSTRAINT chk_email_valid CHECK (INSTR(email, '@') > 1);
-- 56. Disable all constraints on a table
ALTER TABLE employees DISABLE CONSTRAINT ALL;
-- 57. Enable all constraints on a table
ALTER TABLE employees ENABLE CONSTRAINT ALL;
-- 58. Drop primary key and create new one on another column
ALTER TABLE employees DROP PRIMARY KEY;
ALTER TABLE employees ADD CONSTRAINT pk_new_emp PRIMARY KEY (email);
-- 59. Add foreign key with ON DELETE NO ACTION (default)
ALTER TABLE orders ADD CONSTRAINT fk_cust_noaction FOREIGN KEY (cust_id) REFERENCES customers(customer_id) ON DELETE NO ACTION;
-- 60. Add check constraint using PL/SQL function (not recommended)
ALTER TABLE employees ADD CONSTRAINT chk_salary_func CHECK (salary_check(salary) = 1);
Checking Constraint Violations & Testing
===========================================
-- 61. Insert row violating PRIMARY KEY (error expected)
INSERT INTO employees(emp_id, emp_name) VALUES (1, 'John Doe');
INSERT INTO employees(emp_id, emp_name) VALUES (1, 'Jane Smith');
-- 62. Insert row violating UNIQUE constraint
INSERT INTO projects(proj_id, proj_name) VALUES (1, 'Project A');
INSERT INTO projects(proj_id, proj_name) VALUES (2, 'Project A');
-- 63. Insert row violating CHECK constraint
INSERT INTO products(product_id, price) VALUES (1, -10);
-- 64. Insert row violating FOREIGN KEY constraint
INSERT INTO orders(order_id, cust_id) VALUES (1, 9999);
-- 65. Insert row violating NOT NULL constraint
INSERT INTO departments(dept_id, dept_name) VALUES (1, NULL);
-- 66. Insert row passing all constraints
INSERT INTO employees(emp_id, emp_name) VALUES (2, 'Alice');
-- 67. Attempt to disable a PRIMARY KEY constraint (not allowed)
ALTER TABLE employees DISABLE CONSTRAINT pk_emp;
-- 68. Validate all constraints on a table
ALTER TABLE employees VALIDATE CONSTRAINT ALL;
-- 69. Validate a specific constraint
ALTER TABLE products VALIDATE CONSTRAINT chk_price;
-- 70. Enable NOVALIDATE constraint (accepts existing violations)
ALTER TABLE orders ENABLE NOVALIDATE CONSTRAINT fk_cust;
Managing Constraints with Indexes
===========================================
-- 71. Create unique index for unique constraint
CREATE UNIQUE INDEX idx_emp_name ON employees(emp_name);
-- 72. Drop unique index (without dropping constraint)
DROP INDEX idx_emp_name;
-- 73. Add unique constraint using existing index
ALTER TABLE employees ADD CONSTRAINT unq_emp_name UNIQUE USING INDEX idx_emp_name;
-- 74. Rebuild index associated with constraint
ALTER INDEX idx_emp_name REBUILD;
-- 75. Drop constraint with CASCADE (drops dependent constraints)
ALTER TABLE employees DROP CONSTRAINT fk_mgr CASCADE;
-- 76. Disable unique constraint without dropping index
ALTER TABLE employees DISABLE CONSTRAINT unq_emp_name;
-- 77. Enable unique constraint using index
ALTER TABLE employees ENABLE CONSTRAINT unq_emp_name;
-- 78. Create primary key using index
CREATE UNIQUE INDEX idx_pk_emp ON employees(emp_id);
ALTER TABLE employees ADD CONSTRAINT pk_emp PRIMARY KEY USING INDEX idx_pk_emp;
-- 79. Create function-based index for unique constraint
CREATE UNIQUE INDEX idx_emp_email_upper ON employees(UPPER(email));
ALTER TABLE employees ADD CONSTRAINT unq_emp_email UNIQUE USING INDEX idx_emp_email_upper;
-- 80. Create unique constraint with inline syntax (table creation)
CREATE TABLE customers (
customer_id NUMBER PRIMARY KEY,
email VARCHAR2(100) UNIQUE
);
Constraints and Data Integrity Utilities
===========================================
-- 81. Enable constraint NOVALIDATE (constraint active, but existing data not checked)
ALTER TABLE employees ENABLE NOVALIDATE CONSTRAINT chk_salary;
-- 82. Disable constraint NOVALIDATE
ALTER TABLE employees DISABLE NOVALIDATE CONSTRAINT chk_salary;
-- 83. Check if constraint is deferrable
SELECT constraint_name, deferrable FROM user_constraints WHERE table_name = 'EMPLOYEES';
-- 84. Check if constraint is validated
SELECT constraint_name, status FROM user_constraints WHERE table_name = 'PRODUCTS';
-- 85. Disable all foreign keys temporarily for data load
BEGIN
FOR r IN (SELECT constraint_name FROM user_constraints WHERE constraint_type='R' AND table_name='EMPLOYEES') LOOP
EXECUTE IMMEDIATE 'ALTER TABLE employees DISABLE CONSTRAINT ' || r.constraint_name;
END LOOP;
END;
/
-- 86. Enable all foreign keys after data load
BEGIN
FOR r IN (SELECT constraint_name FROM user_constraints WHERE constraint_type='R' AND table_name='EMPLOYEES') LOOP
EXECUTE IMMEDIATE 'ALTER TABLE employees ENABLE CONSTRAINT ' || r.constraint_name;
END LOOP;
END;
/
-- 87. Rename a constraint
ALTER TABLE employees RENAME CONSTRAINT old_constraint_name TO new_constraint_name;
-- 88. Add NOT NULL constraint without a name
ALTER TABLE employees MODIFY email NOT NULL;
-- 89. Disable NOT NULL constraint (by making column nullable)
ALTER TABLE employees MODIFY email NULL;
-- 90. Get all NOT NULL constraints by querying columns
SELECT table_name, column_name FROM user_tab_columns WHERE nullable = 'N';
Miscellaneous Constraint Queries & Examples
===========================================
-- 91. Create unique constraint on multiple columns
ALTER TABLE employee_projects ADD CONSTRAINT unq_emp_proj UNIQUE (emp_id, proj_id);
-- 92. Create check constraint for date range
ALTER TABLE projects ADD CONSTRAINT chk_proj_dates CHECK (start_date <= end_date);
-- 93. Add primary key on VARCHAR2 column
CREATE TABLE countries (
country_code VARCHAR2(2) PRIMARY KEY,
country_name VARCHAR2(100)
);
-- 94. Create foreign key referencing multiple columns
ALTER TABLE order_details ADD CONSTRAINT fk_order_prod FOREIGN KEY (order_id, product_id) REFERENCES orders(order_id, product_id);
-- 95. Drop all constraints for a table (script)
BEGIN
FOR r IN (SELECT constraint_name FROM user_constraints WHERE table_name = 'EMPLOYEES') LOOP
EXECUTE IMMEDIATE 'ALTER TABLE employees DROP CONSTRAINT ' || r.constraint_name;
END LOOP;
END;
/
-- 96. Create a deferred primary key constraint
ALTER TABLE employees ADD CONSTRAINT pk_emp_def PRIMARY KEY (emp_id) DEFERRABLE INITIALLY DEFERRED;
-- 97. Insert a row violating a deferrable constraint but commit succeeds when constraint is deferred
SET CONSTRAINTS ALL DEFERRED;
INSERT INTO employees(emp_id, emp_name) VALUES (null, 'Test');
COMMIT;
-- 98. Create check constraint with REGEXP_LIKE (Oracle 11g+)
ALTER TABLE employees ADD CONSTRAINT chk_phone CHECK (REGEXP_LIKE(phone, '^\d{3}-\d{3}-\d{4}$'));
-- 99. Disable and enable all constraints on a schema
BEGIN
FOR r IN (SELECT table_name, constraint_name FROM user_constraints WHERE constraint_type IN ('P','U','R','C')) LOOP
EXECUTE IMMEDIATE 'ALTER TABLE ' || r.table_name || ' DISABLE CONSTRAINT ' || r.constraint_name;
END LOOP;
END;
/
-- 100. Enable all constraints on a schema
BEGIN
FOR r IN (SELECT table_name, constraint_name FROM user_constraints WHERE constraint_type IN ('P','U','R','C')) LOOP
EXECUTE IMMEDIATE 'ALTER TABLE ' || r.table_name || ' ENABLE CONSTRAINT ' || r.constraint_name;
END LOOP;
END;
/
No comments:
Post a Comment