| 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';