20200819-Disparadores SQL, vistas

1. Defina el disparador:

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

语法:create trigger 触发器名
   before|after 时间 on 表名 for each row 触发器语句

2. El papel del disparador:

Cuando se ejecuta una instrucción en la tabla a, la tabla b se vinculará.

Hay tres funciones principales de los desencadenadores:
insertar: nuevo registro, sin
eliminar registro antiguo : eliminar registro antiguo, no
actualizar registro nuevo: registro nuevo después del cambio y registro antiguo que se ha cambiado

Puede utilizar antiguo | nuevo para referirse a estos registros,
como por ejemplo:
para cada fila,
inserte los valores en la tabla de registros (antiguo.xxx, nuevo.xxx);

#Crear mesa


 CREATE TABLE account_history(
    -> hid INT(11) AUTO_INCREMENT PRIMARY KEY,
    -> account_name VARCHAR(30),
    -> changed_cash DECIMAL(9,2));

#Cuando se actualice la cuenta, inserte un extracto en account_history

CREATE TRIGGER  trig_account_his AFTER UPDATE ON account
FOR EACH ROW
INSERT INTO account_history  (account_name,changed_cash)
VALUES('A',10000);
UPDATE account SET cash =cash+10000 WHERE NAME='A';

#Cuando se inserta un estado de cuenta en la cuenta, se inserta un estado de cuenta en account_history

DELIMITER @@
CREATE TRIGGER trigger_a_insert AFTER INSERT ON account 
FOR EACH ROW
BEGIN 
INSERT INTO account_history(account_name,changed_cash)VALUES('cust','10000');
END@@
INSERT INTO account(NAME,cash)VALUES('cust',10000);@@

SELECT * FROM account;
SELECT * FROM account_history;

DROP TRIGGER trig_account_his;
DROP TRIGGER trigger_a_insert;

#Actualización dinámica

CREATE TRIGGER trigger_a_insert AFTER INSERT ON account
FOR EACH ROW
INSERT INTO account_history(account_name,changed_cash)
VALUES(new.name,new.cash);

INSERT INTO account(NAME,cash)VALUES('abc','100');
INSERT INTO account(NAME,cash)VALUES
('random',cash(RAND()*10000 DECIMAL(9,2)));

#Al eliminar un extracto en la cuenta, actualice el estado de forma sincrónica en account_history

CREATE TRIGGER trig_a_delete AFTER DELETE ON account
FOR EACH ROW 
INSERT INTO account_history(account_name,changed_cash)
VALUES(old.name,old.cash*-1);
DELETE FROM account WHERE id=9;

#Al actualizar un estado de cuenta en la cuenta, actualice el estado en account_history sincrónicamente

CREATE TRIGGER trig_a_update AFTER UPDATE ON account
FOR EACH ROW
INSERT INTO account_history(account_name,changed_cash)
VALUES(CONCAT('old:',old.name,';new:',new.name),new.cash-old.cash)
UPDATE account SET cash=cash-10000, NAME='ICBC' WHERE NAME='B';
UPDATE TABLE account SET cash=10000000 WHERE NAME='c';

3. Ver:

Almacene una tabla completa en un espacio temporal. La declaración SQL de la consulta almacenada en la base de datos puede ser una o varias tablas. Ventajas: Reutilizable Desventajas: Modificación incómoda. Función: Repetitividad mejorada, código simplificado, interfaz externa estable , Mejore la seguridad, aclare el propósito

#ver

CREATE VIEW v_stu_sub_g AS 
SELECT s.studentno,sub_no,s.studentname,subjectName,score,s.gradeid,gradename 
FROM result r 
JOIN student s ON r.stu_id=s.studentno 
JOIN subjects ON sub_no=subjectNo
JOIN grades g ON s.gradeid=g.gradeid;

#Ejercicios: consulte
y obtenga las tablas de puntuación de todos los estudiantes correspondientes a todas las materias, y forme una vista. Forme una vista
en la tabla de estudiantes y la tabla de calificaciones para mostrar la identificación del estudiante, el nombre del estudiante, la identificación de edad y el nombre
de la calificación en la tabla de puntuación, la tabla de estudiantes y la tabla de materias para formar una vista, Muestre los nombres de los estudiantes, los nombres de las materias y las calificaciones
Combine los dos requisitos anteriores y agregue el nombre del grado según el requisito 2.
Obtenga los 5 mejores estudiantes de cada grado según los requisitos anteriores.

CREATE VIEW v1 AS SELECT studentno ,studentname,gradeid,gradename 
FROM student s 
JOIN grades g ON s.gradeid=g.gradeid;

CREATE VIEW v2 AS SELECT studentname, subjectName,score
FROM result r 
JOIN student s ON r.stu_id=s.studentno 
JOIN subjects ON sub_no=subjectNo;



SELECT studentname ,subjectName,score 
FROM v_stu_sub_g a
WHERE (SELECT COUNT(score) FROM v_stu_sub_g b WHERE 
a.score>=b.score AND a.sub_no=b.sub_no)<=2
ORDER BY sub_no ,score DESC;

#Control de flujo

DELIMITER@@
CREATE PROCEDURE testcase(IN VALUE INT(11))
BEGIN
CASE VALUE
WHEN 1 THEN SELECT 1+1;
WHEN 2 THEN SELECT 1+2;
WHEN 3 THEN SELECT 1+3;
ELSE SELECT 1+VALUE;
END CASE;
END@@
DELIMITER;

DELIMITER @@
CREATE PROCEDURE testwhile()
BEGIN
SET @i:=0;
SET @sum:=0;
WHILE@i<=10
DO 
SET @sum:=@sum+@i;
SET  @i:=@i+1;
END WHILE;
SELECT @sum;
END @@
DELIMITER ;

Supongo que te gusta

Origin blog.csdn.net/qq_42005540/article/details/108107007
Recomendado
Clasificación