USE testdb;
CREATE TABLE IF NOT EXISTS parts (
part_no VARCHAR(18) PRIMARY KEY,
description VARCHAR(40),
cost DECIMAL(10 , 2 ) NOT NULL,
price DECIMAL(10,2) NOT NULL
);
DELIMITER $$
CREATE PROCEDURE `check_parts`(IN cost DECIMAL(10,2), IN price DECIMAL(10,2))
BEGIN
IF cost < 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'check constraint on parts.cost failed';
END IF;
IF price < 0 THEN
SIGNAL SQLSTATE '45001'
SET MESSAGE_TEXT = 'check constraint on parts.price failed';
END IF;
IF price < cost THEN
SIGNAL SQLSTATE '45002'
SET MESSAGE_TEXT = 'check constraint on parts.price & parts.cost failed';
END IF;
END$$
DELIMITER ;
-- before insert
DELIMITER $$
CREATE TRIGGER `parts_before_insert` BEFORE INSERT ON `parts`
FOR EACH ROW
BEGIN
CALL check_parts(new.cost,new.price);
END$$
DELIMITER ;
-- before update
DELIMITER $$
CREATE TRIGGER `parts_before_update` BEFORE UPDATE ON `parts`
FOR EACH ROW
BEGIN
CALL check_parts(new.cost,new.price);
END$$
DELIMITER ;
INSERT INTO parts(part_no, description,cost,price)
VALUES('A-001','Cooler',100,120);
INSERT INTO parts(part_no, description,cost,price)
VALUES('A-002','Heater',-100,120);
Error Code: 1644. check constraint on parts.cost failed
INSERT INTO parts(part_no, description,cost,price)
VALUES('A-002','Heater',100,-120);
Error Code: 1644. check constraint on parts.price failed
INSERT INTO parts(part_no, description,cost,price)
VALUES('A-003','wiper',120,100);
1644 - check constraint on parts.price & parts.cost failed
UPDATE parts
SET price = 10
WHERE part_no = 'A-001';
Error Code: 1644. check constraint on parts.price & parts.cost failed
DROP TABLE IF EXISTS parts;
CREATE TABLE IF NOT EXISTS parts_data (
part_no VARCHAR(18) PRIMARY KEY,
description VARCHAR(40),
cost DECIMAL(10 , 2 ) NOT NULL,
price DECIMAL(10,2) NOT NULL
);
CREATE VIEW vparts AS
SELECT
part_no, description, cost, price
FROM
parts_data
WHERE
cost > 0 AND price > 0 AND price >= cost
WITH CHECK OPTION;
INSERT INTO vparts(part_no, description,cost,price)
VALUES('A-001','Cooler',100,120);
INSERT INTO vparts(part_no, description,cost,price)
VALUES('A-002','Heater',-100,120);