Lesson 8 | Updating Table rows with views |
Objective | Use a view to update information in the underlying tables. |
Orders
must reference a Customer
.Customer
may or may not have any orders.VIEW
to update both.CREATE TABLE Customer ( CustomerID INT PRIMARY KEY, Name VARCHAR(100), Email VARCHAR(100) ); CREATE TABLE Orders ( OrderID INT PRIMARY KEY, CustomerID INT, OrderDate DATE, Amount DECIMAL(10, 2), FOREIGN KEY (CustomerID) REFERENCES Customer(CustomerID) );
Since Orders
is optional, we use a LEFT JOIN
.
CREATE VIEW CustomerOrderView AS SELECT c.CustomerID, c.Name, c.Email, o.OrderID, o.OrderDate, o.Amount FROM Customer c LEFT JOIN Orders o ON c.CustomerID = o.CustomerID;
Not all views are inherently updatable. To update both Customer
and Orders
through the view:
UPDATE
on the View:CREATE TRIGGER trg_CustomerOrderView_Update INSTEAD OF UPDATE ON CustomerOrderView FOR EACH ROW BEGIN -- Update Customer UPDATE Customer SET Name = :NEW.Name, Email = :NEW.Email WHERE CustomerID = :OLD.CustomerID; -- If OrderID exists, update Order IF :NEW.OrderID IS NOT NULL THEN UPDATE Orders SET OrderDate = :NEW.OrderDate, Amount = :NEW.Amount WHERE OrderID = :OLD.OrderID; END IF; END;
You can also handle INSERT logic similarly:
CREATE TRIGGER trg_CustomerOrderView_Insert INSTEAD OF INSERT ON CustomerOrderView FOR EACH ROW BEGIN -- Insert into Customer INSERT INTO Customer (CustomerID, Name, Email) VALUES (:NEW.CustomerID, :NEW.Name, :NEW.Email); -- If order details are provided, insert into Orders IF :NEW.OrderID IS NOT NULL THEN INSERT INTO Orders (OrderID, CustomerID, OrderDate, Amount) VALUES (:NEW.OrderID, :NEW.CustomerID, :NEW.OrderDate, :NEW.Amount); END IF; END;
Operation | Action |
---|---|
View Join | LEFT JOIN to include Customers even without Orders |
Updates | Use INSTEAD OF trigger to route updates to appropriate base tables |
Inserts | Use trigger to conditionally insert into Orders if data is present |
Deletes | (Optional) Use similar INSTEAD OF DELETE logic if deletions are needed |
CREATE TABLE Customer ( CustomerID INT PRIMARY KEY, Name NVARCHAR(100), Email NVARCHAR(100) ); CREATE TABLE Orders ( OrderID INT PRIMARY KEY, CustomerID INT FOREIGN KEY REFERENCES Customer(CustomerID), OrderDate DATE, Amount DECIMAL(10, 2) );
CREATE VIEW CustomerOrderView AS SELECT c.CustomerID, c.Name, c.Email, o.OrderID, o.OrderDate, o.Amount FROM Customer c LEFT JOIN Orders o ON c.CustomerID = o.CustomerID;
CREATE TRIGGER trg_Update_CustomerOrderView ON CustomerOrderView INSTEAD OF UPDATE AS BEGIN SET NOCOUNT ON; -- Update Customer Info UPDATE c SET c.Name = i.Name, c.Email = i.Email FROM Customer c JOIN inserted i ON c.CustomerID = i.CustomerID; -- Update Orders Info (if any) UPDATE o SET o.OrderDate = i.OrderDate, o.Amount = i.Amount FROM Orders o JOIN inserted i ON o.OrderID = i.OrderID WHERE i.OrderID IS NOT NULL; END;
CREATE TRIGGER trg_Insert_CustomerOrderView ON CustomerOrderView INSTEAD OF INSERT AS BEGIN SET NOCOUNT ON; -- Insert into Customer INSERT INTO Customer (CustomerID, Name, Email) SELECT CustomerID, Name, Email FROM inserted; -- Conditionally insert into Orders INSERT INTO Orders (OrderID, CustomerID, OrderDate, Amount) SELECT OrderID, CustomerID, OrderDate, Amount FROM inserted WHERE OrderID IS NOT NULL; END;
CREATE TRIGGER trg_Delete_CustomerOrderView ON CustomerOrderView INSTEAD OF DELETE AS BEGIN SET NOCOUNT ON; -- Delete orders first (foreign key dependency) DELETE o FROM Orders o JOIN deleted d ON o.OrderID = d.OrderID; -- Then delete customer DELETE c FROM Customer c JOIN deleted d ON c.CustomerID = d.CustomerID; END;
-- Insert customer only INSERT INTO CustomerOrderView (CustomerID, Name, Email) VALUES (1, 'Alice', 'alice@example.com'); -- Insert customer + order INSERT INTO CustomerOrderView (CustomerID, Name, Email, OrderID, OrderDate, Amount) VALUES (2, 'Bob', 'bob@example.com', 1001, '2025-06-20', 300.00); -- Update order and customer info UPDATE CustomerOrderView SET Name = 'Robert', Amount = 350.00 WHERE OrderID = 1001;
INSTEAD OF
triggers.SELECT * FROM Customer
and SELECT * FROM Orders
after testing inserts and updates.CREATE VIEW MyView AS SELECT * FROM CustomerInfo, PhoneNumbers WHERE CustomerInfo.CustomerID = PhoneNumbers.CustomerID
SELECT Fname, Lname FROM EMPLOYEE, PROJECT, WORKS_ON WHERE Ssn=Essn AND Pno=Pnumber AND Pname='ProductX';
UV1: UPDATEWORKS_ON1 SET Pname = 'ProductY' WHERE Lname='Smith' AND Fname='John' AND Pname='ProductX';