Les CHECK
permettent d'ajouter des validations effectuées avant une insertion ou une modification dans une table.
CREATE OR REPLACE TABLE teachers (
employee_number INT AUTO_INCREMENT KEY,
name VARCHAR(200) NOT NULL CHECK(TRIM(name) != ''),
email VARCHAR(200) UNIQUE NOT NULL CHECK( email REGEXP '^[^@]+@cshawi\\.ca$'),
birthday DATE NOT NULL,
CONSTRAINT is_adult CHECK(YEAR(birthday) < (2021 - 18)), -- CURDATE() non-deterministe :(
death DATE,
CONSTRAINT death_after_birth CHECK(death > birthday)
);
INSERT INTO teachers (name, email, birthday, death)
VALUES
-- (' ', 'jh@cshawi.ca', '2021-01-01', null); -- name
-- ('James', 'jh@hotmail.com', '2021-01-01', null); -- email
-- ('James', 'j@h@cshawi.ca', '2021-01-01', null); -- email
-- ('James', 'jh@cshawi.ca', '2021-01-01', null); -- birthday
-- ('James', 'jh@cshawi.ca', '2002-01-01', '2001-01-01'); -- death
('James', 'jh@cshawi.ca', '2002-01-01', null); -- OK
Un type d'objet créé dans la base de données permettant de réagir aux événements INSERT
, UPDATE
, DELETE
d'une table
CREATE [OR REPLACE] TRIGGER [IF NOT EXISTS] trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW [ { FOLLOWS | PRECEDES } other_trigger_name ]
BEGIN
sql_query;
...;
other_sql_query;
END;
-- Liste
SHOW TRIGGERS;
-- Suppression
DROP TRIGGER trigger_name;
📚 Multiple statements triggers
BEFORE
ou AFTER
INSERT
, UPDATE
, DELETE
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Le message d\'erreur';
NEW
pour un INSERT ou UPDATEOLD
pour un UPDATE ou DELETEOLD.email -- pour lire une colonne
INSERT
, UPDATE
, DELETE
ON DELETE
/ON UPDATE
des clés étrangères ne déclenchent PAS les triggersCREATE OR REPLACE TABLE teachers (
employee_number INT AUTO_INCREMENT KEY,
name VARCHAR(200) NOT NULL CHECK(TRIM(name) != ''),
email VARCHAR(200) UNIQUE NOT NULL CHECK( email REGEXP '^[^@]+@cshawi\.ca'),
birthday DATE NOT NULL, -- Validation dans le TRIGGER
death DATE,
CONSTRAINT death_after_birth CHECK(death > birthday)
);
CREATE TRIGGER teachers_is_adult BEFORE INSERT ON teachers FOR EACH ROW
BEGIN
IF(TIMESTAMPDIFF(YEAR, NEW.birthday, CURDATE()) < 18) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Teacher is under 18 years old.';
END IF;
END;
INSERT INTO teachers (name, email, birthday, death)
VALUES
('James', 'jh@cshawi.ca', '2021-01-01', null); -- birthday
-- ('James', 'jh@cshawi.ca', '2002-01-01', null); -- OK
Permet de créer une table virtuelle à partir d'un SELECT
CREATE [OR REPLACE] VIEW [IF NOT EXISTS] view_name [(column_list)] AS
select_statement;
-- Voir la définition
SHOW CREATE VIEW view_name;
-- Liste
SHOW TABLES;
-- Voir JUSTE les vues
SHOW FULL TABLES WHERE Table_type = 'VIEW';
-- Suppression
DROP VIEW [IF EXISTS] view_name [, view_name, ...]
SELECT *
devient une énumération explicite, donc de nouvelles colonnes dans la BD n'impactent pas la vueSELECT
ne doit pas générer d'erreursCREATE OR REPLACE TABLE teachers (
employee_number INT AUTO_INCREMENT KEY,
name VARCHAR(200) NOT NULL CHECK(TRIM(name) != ''),
email VARCHAR(200) UNIQUE NOT NULL CHECK( email REGEXP '^[^@]+@cshawi\.ca'),
birthday DATE NOT NULL,
death DATE,
CONSTRAINT death_after_birth CHECK(death > birthday)
);
INSERT INTO teachers (name, email, birthday, death)
VALUES ('James', 'jh@cshawi.ca', '2002-01-01', null);
-- Vue
CREATE OR REPLACE VIEW v_teachers AS
SELECT *, (TIMESTAMPDIFF(YEAR, birthday, CURDATE())) AS `age` FROM teachers;
-- Utilisation, comme un table
SELECT * FROM v_teachers;