首页 > 数据库 >SQL Server 触发器利用临时表在外检表插入前插入主键表

SQL Server 触发器利用临时表在外检表插入前插入主键表

时间:2024-05-21 10:10:36浏览次数:19  
标签:触发器 Students 检表 ClassName 插入 Classes -- 主键

在SQL Server中,你可以使用触发器(trigger)来在插入学生信息之前,根据班级名称在班级表中插入相应的班级记录。这通常涉及到两步:首先,检查班级表中是否已存在相应的班级;如果不存在,则插入;然后,允许插入学生记录。

下面是一个示例,展示如何创建这样的触发器:

  1. 假设你有两个表:Students 和 Classes

Students 表结构可能如下:

sqlCREATE TABLE Students (
StudentID INT PRIMARY KEY,
StudentName NVARCHAR(100),
ClassName NVARCHAR(100) FOREIGN KEY REFERENCES Classes(ClassName)
);

ClassName是外键,引用Classes表中的ClassName` 列。

Classes 表结构可能如下:

sqlCREATE TABLE Classes (
ClassName NVARCHAR(100) PRIMARY KEY,
ClassDescription NVARCHAR(MAX)
);
  1. 创建触发器:
sqlCREATE TRIGGER trg_InsertClassBeforeStudent
ON Students
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;

-- 临时表用于存储插入的学生数据
DECLARE @InsertedStudents TABLE (
StudentID INT,
StudentName NVARCHAR(100),
ClassName NVARCHAR(100)
);

-- 将要插入的数据放入临时表
INSERT INTO @InsertedStudents (StudentID, StudentName, ClassName)
SELECT StudentID, StudentName, ClassName FROM inserted;

-- 遍历临时表中的每一条记录
DECLARE @CurrentStudentID INT, @CurrentStudentName NVARCHAR(100), @CurrentClassName NVARCHAR(100);

DECLARE cursor_Students CURSOR FOR
SELECT StudentID, StudentName, ClassName FROM @InsertedStudents;

OPEN cursor_Students;
FETCH NEXT FROM cursor_Students INTO @CurrentStudentID, @CurrentStudentName, @CurrentClassName;

WHILE @@FETCH_STATUS = 0
BEGIN
-- 检查班级是否存在,如果不存在则插入
IF NOT EXISTS (SELECT 1 FROM Classes WHERE ClassName = @CurrentClassName)
BEGIN
INSERT INTO Classes (ClassName, ClassDescription)
VALUES (@CurrentClassName, 'No description yet');
END

-- 这里你可以执行其他的逻辑,比如插入学生记录等
-- 但由于我们使用了INSTEAD OF INSERT触发器,实际的插入操作不会在这里执行

FETCH NEXT FROM cursor_Students INTO @CurrentStudentID, @CurrentStudentName, @CurrentClassName;
END

CLOSE cursor_Students;
DEALLOCATE cursor_Students;

-- 实际的学生插入操作将在这里发生,但由于使用了INSTEAD OF INSERT触发器,我们需要手动执行它
-- 注意:这里我们假设班级已经存在或已被创建,因此可以安全地插入学生记录
INSERT INTO Students (StudentID, StudentName, ClassName)
SELECT StudentID, StudentName, ClassName FROM @InsertedStudents;
END;

这个触发器使用了INSTEAD OF INSERT,这意味着当你尝试向Students表插入数据时,实际的插入操作不会执行,而是执行这个触发器中定义的逻辑。触发器首先检查班级是否存在,如果不存在,则在Classes表中创建该班级。然后,它会执行实际的插入操作,将数据插入到Students表中。

注意:在实际的生产环境中,使用游标可能不是最高效的方法,特别是在处理大量数据时。这个示例是为了说明如何使用触发器来实现特定的逻辑,而不是作为生产环境的最佳实践。你可能需要考虑其他的方法,比如使用集合操作来处理插入的数据。

标签:触发器,Students,检表,ClassName,插入,Classes,--,主键
From: https://www.cnblogs.com/jianxiaoxiu/p/18203351

相关文章

  • 在SQLServer中使用SQL语句插入数据出现乱码或问号的解决方法
    原文链接:https://www.cnblogs.com/net5x/p/12430808.html错误产生的原因:        出现使用SQL语句插入数据出现乱码或问号是由于数据库属性的排序规则设置不正确.解决方法:方法一:手动修改(设置数据库的排序规则)注意事项:要确定修改的数据库没有被使用,否则会失败!具体步骤......
  • 关于 双向不循环列表的创建、插入、删除、遍历、检索、销毁
    双向循环链表公式双向不循环链表代码#include<stdio.h>#include<stdlib.h>#include<string.h>//宏定义一个数据域#defineDATA_LEN60//双向不循环链表的节点定义typedefstructdouble_link_list{//数据域chardata[DATA_LEN];//数据域,存......
  • APC插入
    2.APC插入介绍WRK中的KeInsertQueueApc函数原型BOOLEANKeInsertQueueApc(__inoutPRKAPCApc,//apc结构__in_optPVOIDSystemArgument1,//参数1(可选)__in_optPVOIDSystemArgument2,//参数2(可选)__inKPRIORITYIncrement//优先级,R3下自动传值)......
  • NPOI Excel指定范围内插入图片(纵横比)
    NPOIExcel指定范围内插入图片(纵横比),考虑列宽,行高比。//Iassumeyouwanttoinserttheimageintotheworksheetloadedintheworkbookparameter//Youcanadjusttheratiovariableaccordinglytocontroltheratioofwidthandheight//Youcanalsoadjust......
  • 已卸载Tuxera NTFS for Mac后仍在ntfs磁盘插入后仍有提示
    “Microsoft NTFS by Tuxeracouldnotvalidateyourproductkey.PleasecontactTuxera'semailsupportforhelp.”我之前安装过MicrosoftNTFS但是过期了,我就给它卸载了,但是每次插入u盘还是会弹出上面一行内容的提示框。于是我找到这个朋友发的[文章](https://zhuanla......
  • lightdb mysql 8.0兼容之不可见主键
    数据库设计通常需要满足一定的范式要求,其中主键更是最基本的要求。不过,数据库管理系统却允许我们创建没有主键的表。这样的表在数据库中会带来查询性能低下、复制延迟甚至无法实现高可用配置等问题。为此,lightdb在22.1版本引入了一个新的功能,叫做不可见主键(GeneratedInv......
  • gorm实现MySQL的INSERT INTO ... ON DUPLICATE KEY UPDATE差异化插入和更新
    比如插入f_create_uid,更新时忽略f_create_uid,只更新f_update_uid。可使用gorm的BeforeCreate和BeforeUpdate钩子,这两个钩子分别在创建和更新记录之前被调用。//BeforeCreate在创建记录之前调用func(dob*MyStruct)BeforeCreate(tx*gorm.DB)(errerror){dob......
  • openGauss 使用合并方式更新和插入数据
    使用合并方式更新和插入数据在用户需要将一个表中所有的数据或大量的数据添加至现有表的场景下,openGauss提供了MERGEINTO语句通过两个表合并的方式高效地将新数据添加到现有表。MERGEINTO语句将目标表和源表中数据针对关联条件进行匹配,若关联条件匹配时对目标表进行UPDATE,关联......
  • SQL 复杂查询更新插入
    通过现有数据快速插入构造新数据1INSERTINTO`merge`.`ods_binlog_traffic_vehicle_tracks`(2`id`,3`vehicle_no`,4.5.6.7`gps_datetime`,8.9.10.11`update_time`,12.13.14.15)......
  • Mysql批量插入数据(python脚本)
    有个需求:需要在table1中插入205条数据,role_id固定为65,menu_id从91开始方法二:python脚本实现PyMySQL是一个纯Python编写的MySQL客户端库,用于连接和操作MySQL数据库。以下是PyMySQL的主要功能和优点:功能:数据库连接:PyMySQL提供了connect()方法,用于建立与MySQL数据库的连接。一旦......