数据库每日一题(3)触发器

题目

在这里插入图片描述

初答(有误)

CREATE TRIGGER tri_zc ON 教师表
FOR INSERT, UPDATE
AS
BEGIN 
UPDATE 部门表
SET 高级职称人数 = 高级职称人数 + 1
WHERE INSERTED.高级职称 = '教授' OR INSERTED.高级职称 = '副教授'
	AND INSERTED.所在部门号 = 部门号
END

参考解答(有误)

在这里插入图片描述
语法错误

实操(正确)

建表

IF NOT EXISTS (SELECT name FROM SYS.DATABASES WHERE name = '教学' )
CREATE DATABASE 教学
GO

USE 教学


IF NOT EXISTS (SELECT NAME FROM sysobjects WHERE NAME = '教师表')
CREATE TABLE 教师表
(
	教师号 int PRIMARY KEY,
	姓名 varchar(10),
	所在部门号 varchar(4),
	职称 varchar(10)
)
GO
IF NOT EXISTS (SELECT NAME FROM sysobjects WHERE NAME = '部门表')
CREATE TABLE 部门表
(
	部门号 varchar(4) PRIMARY KEY,
	部门名 varchar(10),
	高级职称人数 int
)
GO

空表

触发器

CREATE TRIGGER tri_zc ON 教师表
AFTER INSERT, UPDATE
AS
BEGIN
--记录插入的职称与所在部门号
DECLARE @zc varchar(10)
DECLARE @dept varchar(4)

SELECT @zc = 职称, @dept = 所在部门号 
FROM inserted 

UPDATE 部门表
SET 高级职称人数 = 高级职称人数 + 1
WHERE (@zc = '教授' OR  @zc = '副教授')  --此处应为完整格式
	AND @dept= 部门号
END
GO

测试

插入初始值

在这里插入图片描述

问题1 语句结合优先级

第一次出现错误
全部更新
经检查,问题在于逻辑语句的优先级
在这里插入图片描述
格式虽然表示职称或为教授或为副教授,但实际 AND 优先级高于 OR,即实际程序为:

UPDATE 部门表
SET 高级职称人数 = 高级职称人数 + 1
WHERE @zc = '教授' OR  (@zc = '副教授'
	AND  部门号 = @dept)

此逻辑表示只要职称为教授,将对每个部门的高级职称人数增加1个,显然错误。修正在 OR 语句两边加括号。问题解决:

在这里插入图片描述

问题2 不支持批量插入

兴奋尝试所有
网上查阅资料发现:

触发器不是每插入一行数据,就触发一下,而是,批量插入,只触发一次

此问题解决方式,待继续探索……

源码地址

GitHub仓库

发布了39 篇原创文章 · 获赞 3 · 访问量 4655

猜你喜欢

转载自blog.csdn.net/cascara/article/details/104293860