触发器或者存储过程

wwfxgm 2017-11-21 08:47:31
我有一个如下的题目,需要实现的是,前端导入记录到TCT表的时候,自动把记录插入 teacher,course,TC这三张表。



--导入表如下结构
DROP TABLE
IF EXISTS dbo.TCT
CREATE TABLE TCT (
ID int IDENTITY(1,1) PRIMARY KEY,
tname nvarchar (16),
cname nvarchar (32)
)
--记录一旦插入 TCT 表的时候,需要将教师姓名tname插入 teacher 表,课程名称cname插入 course 表,对应的关系插入 TC表

--示例数据如下:
insert into dbo.TCT select N'叶平',N'语文' union all
select N'贺高',N'数学' union all
select N'杨艳',N'英语' union all
select N'周磊',N'物理'

DROP TABLE
IF EXISTS dbo.teacher
CREATE TABLE teacher (t# INT, tname nvarchar(16)) --教师姓名表

DROP TABLE
IF EXISTS dbo.course
CREATE TABLE course (c# INT, cname nvarchar(32),) --课程表

DROP TABLE
IF EXISTS dbo.TC
CREATE TABLE TC (t# INT, c# INT,) --教师课程表


...全文
129 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 2017-11-21
  • 打赏
  • 举报
回复
CREATE TABLE TCT (
ID int IDENTITY(1,1) PRIMARY KEY,
tname nvarchar (16),
cname nvarchar (32)
)
CREATE TABLE teacher (t# INT IDENTITY, tname nvarchar(16)) --教师姓名表
CREATE TABLE course (c# INT IDENTITY, cname nvarchar(32),) --课程表
CREATE TABLE TC (t# INT, c# INT,) --教师课程表
CREATE TRIGGER dbo.TCT_tri ON [dbo].TCT
FOR INSERT
AS
BEGIN
INSERT INTO dbo.teacher
( tname
)
SELECT DISTINCT tname
FROM inserted
WHERE tname NOT IN (SELECT tname FROM dbo.teacher)

INSERT INTO dbo.course
( cname
)
SELECT DISTINCT cname
FROM inserted
WHERE cname NOT IN (SELECT cname FROM dbo.course)

INSERT INTO dbo.TC
( t# ,
c#
)
SELECT dbo.teacher.t# ,
dbo.course.c#
FROM teacher
JOIN inserted ON teacher.tname = inserted.tname
JOIN dbo.course ON course.cname = inserted.cname

END
GO


insert into dbo.TCT
SELECT N'叶平',N'语文' union ALL
SELECT N'叶平',N'数学' union ALL
SELECT N'叶平',N'地理' union all
select N'贺高',N'数学' union all
select N'杨艳',N'英语' union all
select N'周磊',N'物理'

SELECT * FROM TCT
SELECT * FROM dbo.teacher
SELECT * FROM dbo.course
SELECT * FROM dbo.TC


wwfxgm 2017-11-21
  • 打赏
  • 举报
回复
引用 6 楼 sinat_28984567 的回复:
[quote=引用 5 楼 wwfxgm 的回复:] 前端插入TCT表的时候,这个记录应该有重复的。比如 N'叶平',N'语文', 还可以有记录 N'叶平',N'数学',N'叶平',N'地理',N'叶平',N'化学'。 对于这样的情况,这个插入teacher表的时候,我需要只插入不重复的教师姓名到teacher表。 不重复的课程名称插入course表。
这个很简单,加一个where not in 就可以了,但是还是上边那个问题,从哪指定的T#和C#?[/quote] 这个 我是想 isnull(max(t#),0)+1 from dbo.teacher 这样产生的。 不过,自增长能满足需求。那就用自增长。
wwfxgm 2017-11-21
  • 打赏
  • 举报
回复
引用 4 楼 sinat_28984567 的回复:
[quote=引用 3 楼 wwfxgm 的回复:] [quote=引用 2 楼 sinat_28984567 的回复:]
--CREATE TABLE TCT (
--  ID int IDENTITY(1,1) PRIMARY KEY,
--    tname nvarchar (16),
--    cname nvarchar (32)
--) 
--CREATE TABLE teacher (t# INT IDENTITY, tname nvarchar(16)) --教师姓名表
--CREATE TABLE course (c# INT IDENTITY, cname nvarchar(32),) --课程表

CREATE TRIGGER dbo.TCT_tri ON [dbo].TCT
    FOR INSERT
AS
    BEGIN
        INSERT  INTO dbo.teacher
                ( tname
                )
                SELECT  tname
                FROM    inserted

        INSERT  INTO dbo.course
                ( cname
                )
                SELECT  cname
                FROM    inserted
              
        INSERT  INTO dbo.TC
                ( t# ,
                  c#
                )
                SELECT  dbo.teacher.t# ,
                        dbo.course.c#
                FROM    teacher
                        JOIN inserted ON teacher.tname = inserted.tname
                        JOIN dbo.course ON course.cname = inserted.cname
    END
GO


insert into dbo.TCT select N'叶平',N'语文' union all
 select N'贺高',N'数学' union all
 select N'杨艳',N'英语' union all
 select N'周磊',N'物理'

SELECT * FROM TCT
SELECT * FROM dbo.teacher
SELECT * FROM dbo.course
SELECT * FROM dbo.TC
这个 dbo.teacher 和 dbo.course 的 T# C# 不是自增长的。 需要指定值的[/quote] 怎么指定? 记录一旦插入 TCT 表的时候,需要将教师姓名tname插入 teacher 表,课程名称cname插入 course 表,对应的关系插入 TC表 插入TCT 表的是时候没有T#和C#的值,从哪指定的?[/quote] 前端插入TCT表的时候,这个记录应该有重复的。比如 N'叶平',N'语文', 还可以有记录 N'叶平',N'数学',N'叶平',N'地理',N'叶平',N'化学'。 对于这样的情况,这个插入teacher表的时候,我需要只插入不重复的教师姓名到teacher表。 不重复的课程名称插入course表。
二月十六 2017-11-21
  • 打赏
  • 举报
回复
引用 5 楼 wwfxgm 的回复:
前端插入TCT表的时候,这个记录应该有重复的。比如 N'叶平',N'语文', 还可以有记录 N'叶平',N'数学',N'叶平',N'地理',N'叶平',N'化学'。 对于这样的情况,这个插入teacher表的时候,我需要只插入不重复的教师姓名到teacher表。 不重复的课程名称插入course表。
这个很简单,加一个where not in 就可以了,但是还是上边那个问题,从哪指定的T#和C#?
二月十六 2017-11-21
  • 打赏
  • 举报
回复
引用 3 楼 wwfxgm 的回复:
[quote=引用 2 楼 sinat_28984567 的回复:]
--CREATE TABLE TCT (
--  ID int IDENTITY(1,1) PRIMARY KEY,
--    tname nvarchar (16),
--    cname nvarchar (32)
--) 
--CREATE TABLE teacher (t# INT IDENTITY, tname nvarchar(16)) --教师姓名表
--CREATE TABLE course (c# INT IDENTITY, cname nvarchar(32),) --课程表

CREATE TRIGGER dbo.TCT_tri ON [dbo].TCT
    FOR INSERT
AS
    BEGIN
        INSERT  INTO dbo.teacher
                ( tname
                )
                SELECT  tname
                FROM    inserted

        INSERT  INTO dbo.course
                ( cname
                )
                SELECT  cname
                FROM    inserted
              
        INSERT  INTO dbo.TC
                ( t# ,
                  c#
                )
                SELECT  dbo.teacher.t# ,
                        dbo.course.c#
                FROM    teacher
                        JOIN inserted ON teacher.tname = inserted.tname
                        JOIN dbo.course ON course.cname = inserted.cname
    END
GO


insert into dbo.TCT select N'叶平',N'语文' union all
 select N'贺高',N'数学' union all
 select N'杨艳',N'英语' union all
 select N'周磊',N'物理'

SELECT * FROM TCT
SELECT * FROM dbo.teacher
SELECT * FROM dbo.course
SELECT * FROM dbo.TC
这个 dbo.teacher 和 dbo.course 的 T# C# 不是自增长的。 需要指定值的[/quote] 怎么指定? 记录一旦插入 TCT 表的时候,需要将教师姓名tname插入 teacher 表,课程名称cname插入 course 表,对应的关系插入 TC表 插入TCT 表的是时候没有T#和C#的值,从哪指定的?
wwfxgm 2017-11-21
  • 打赏
  • 举报
回复
引用 2 楼 sinat_28984567 的回复:
--CREATE TABLE TCT (
--  ID int IDENTITY(1,1) PRIMARY KEY,
--    tname nvarchar (16),
--    cname nvarchar (32)
--) 
--CREATE TABLE teacher (t# INT IDENTITY, tname nvarchar(16)) --教师姓名表
--CREATE TABLE course (c# INT IDENTITY, cname nvarchar(32),) --课程表

CREATE TRIGGER dbo.TCT_tri ON [dbo].TCT
    FOR INSERT
AS
    BEGIN
        INSERT  INTO dbo.teacher
                ( tname
                )
                SELECT  tname
                FROM    inserted

        INSERT  INTO dbo.course
                ( cname
                )
                SELECT  cname
                FROM    inserted
              
        INSERT  INTO dbo.TC
                ( t# ,
                  c#
                )
                SELECT  dbo.teacher.t# ,
                        dbo.course.c#
                FROM    teacher
                        JOIN inserted ON teacher.tname = inserted.tname
                        JOIN dbo.course ON course.cname = inserted.cname
    END
GO


insert into dbo.TCT select N'叶平',N'语文' union all
 select N'贺高',N'数学' union all
 select N'杨艳',N'英语' union all
 select N'周磊',N'物理'

SELECT * FROM TCT
SELECT * FROM dbo.teacher
SELECT * FROM dbo.course
SELECT * FROM dbo.TC
这个 dbo.teacher 和 dbo.course 的 T# C# 不是自增长的。 需要指定值的
wwfxgm 2017-11-21
  • 打赏
  • 举报
回复
需要的结果 如下 语句生成的样子:
insert into dbo.Teacher select 1,N'叶平' union all
 select 2,N'贺高' union all
 select 3,N'杨艳' union all
 select 4,N'周磊'


 insert into Course select 1,N'语文' union all
 select 2,N'数学' union all
 select 3,N'英语' union all
 select 4,N'物理'

INSERT into dbo.TCT values(1,1 ),(2,2),(3,3),(4,4)
二月十六 2017-11-21
  • 打赏
  • 举报
回复
--CREATE TABLE TCT (
-- ID int IDENTITY(1,1) PRIMARY KEY,
-- tname nvarchar (16),
-- cname nvarchar (32)
--)
--CREATE TABLE teacher (t# INT IDENTITY, tname nvarchar(16)) --教师姓名表
--CREATE TABLE course (c# INT IDENTITY, cname nvarchar(32),) --课程表

CREATE TRIGGER dbo.TCT_tri ON [dbo].TCT
FOR INSERT
AS
BEGIN
INSERT INTO dbo.teacher
( tname
)
SELECT tname
FROM inserted

INSERT INTO dbo.course
( cname
)
SELECT cname
FROM inserted

INSERT INTO dbo.TC
( t# ,
c#
)
SELECT dbo.teacher.t# ,
dbo.course.c#
FROM teacher
JOIN inserted ON teacher.tname = inserted.tname
JOIN dbo.course ON course.cname = inserted.cname
END
GO


insert into dbo.TCT select N'叶平',N'语文' union all
select N'贺高',N'数学' union all
select N'杨艳',N'英语' union all
select N'周磊',N'物理'

SELECT * FROM TCT
SELECT * FROM dbo.teacher
SELECT * FROM dbo.course
SELECT * FROM dbo.TC


二月十六 2017-11-21
  • 打赏
  • 举报
回复
引用 9 楼 wwfxgm 的回复:
[quote=引用 8 楼 sinat_28984567 的回复:]
CREATE TABLE TCT (
  ID int IDENTITY(1,1) PRIMARY KEY,
    tname nvarchar (16),
    cname nvarchar (32)
) 
CREATE TABLE teacher (t# INT IDENTITY, tname nvarchar(16)) --教师姓名表
CREATE TABLE course (c# INT IDENTITY, cname nvarchar(32),) --课程表
CREATE TABLE TC (t# INT, c# INT,) --教师课程表
CREATE TRIGGER dbo.TCT_tri ON [dbo].TCT
    FOR INSERT
AS
    BEGIN
        INSERT  INTO dbo.teacher
                ( tname
                )
                SELECT DISTINCT  tname
                FROM    inserted
				WHERE tname NOT IN (SELECT tname FROM dbo.teacher)
 
        INSERT  INTO dbo.course
                ( cname
                )
                SELECT DISTINCT  cname
                FROM    inserted
               WHERE cname NOT IN (SELECT cname FROM dbo.course)

        INSERT  INTO dbo.TC
                ( t# ,
                  c#
                )
                SELECT  dbo.teacher.t# ,
                        dbo.course.c#
                FROM    teacher
                        JOIN inserted ON teacher.tname = inserted.tname
                        JOIN dbo.course ON course.cname = inserted.cname

    END
GO
 
 
insert into dbo.TCT 
SELECT N'叶平',N'语文' union ALL
SELECT N'叶平',N'数学' union ALL
SELECT N'叶平',N'地理' union all
 select N'贺高',N'数学' union all
 select N'杨艳',N'英语' union all
 select N'周磊',N'物理'
 
SELECT * FROM TCT
SELECT * FROM dbo.teacher
SELECT * FROM dbo.course
SELECT * FROM dbo.TC
这个语句 INSERT INTO dbo.TC ( t# , c# ) SELECT dbo.teacher.t# , dbo.course.c# FROM teacher JOIN inserted ON teacher.tname = inserted.tname JOIN dbo.course ON course.cname = inserted.cname 我第二次插入值的时候, dbo.TC 还是会出现重复值了。如何避免?[/quote]
ALTER TRIGGER dbo.TCT_tri ON [dbo].TCT
    FOR INSERT
AS
    BEGIN
        INSERT  INTO dbo.teacher
                ( tname
                )
                SELECT DISTINCT  tname
                FROM    inserted
				WHERE tname NOT IN (SELECT tname FROM dbo.teacher)
 
        INSERT  INTO dbo.course
                ( cname
                )
                SELECT DISTINCT  cname
                FROM    inserted
               WHERE cname NOT IN (SELECT cname FROM dbo.course)

        INSERT  INTO dbo.TC
                ( t# ,
                  c#
                )
                SELECT  dbo.teacher.t# ,
                        dbo.course.c#
                FROM    teacher
                        JOIN inserted ON teacher.tname = inserted.tname
                        JOIN dbo.course ON course.cname = inserted.cname
						WHERE NOT EXISTS(SELECT 1 FROM TC WHERE t#=dbo.teacher.t# AND c#=dbo.course.c#)

    END
GO
wwfxgm 2017-11-21
  • 打赏
  • 举报
回复
引用 8 楼 sinat_28984567 的回复:
CREATE TABLE TCT (
  ID int IDENTITY(1,1) PRIMARY KEY,
    tname nvarchar (16),
    cname nvarchar (32)
) 
CREATE TABLE teacher (t# INT IDENTITY, tname nvarchar(16)) --教师姓名表
CREATE TABLE course (c# INT IDENTITY, cname nvarchar(32),) --课程表
CREATE TABLE TC (t# INT, c# INT,) --教师课程表
CREATE TRIGGER dbo.TCT_tri ON [dbo].TCT
    FOR INSERT
AS
    BEGIN
        INSERT  INTO dbo.teacher
                ( tname
                )
                SELECT DISTINCT  tname
                FROM    inserted
				WHERE tname NOT IN (SELECT tname FROM dbo.teacher)
 
        INSERT  INTO dbo.course
                ( cname
                )
                SELECT DISTINCT  cname
                FROM    inserted
               WHERE cname NOT IN (SELECT cname FROM dbo.course)

        INSERT  INTO dbo.TC
                ( t# ,
                  c#
                )
                SELECT  dbo.teacher.t# ,
                        dbo.course.c#
                FROM    teacher
                        JOIN inserted ON teacher.tname = inserted.tname
                        JOIN dbo.course ON course.cname = inserted.cname

    END
GO
 
 
insert into dbo.TCT 
SELECT N'叶平',N'语文' union ALL
SELECT N'叶平',N'数学' union ALL
SELECT N'叶平',N'地理' union all
 select N'贺高',N'数学' union all
 select N'杨艳',N'英语' union all
 select N'周磊',N'物理'
 
SELECT * FROM TCT
SELECT * FROM dbo.teacher
SELECT * FROM dbo.course
SELECT * FROM dbo.TC
这个语句 INSERT INTO dbo.TC ( t# , c# ) SELECT dbo.teacher.t# , dbo.course.c# FROM teacher JOIN inserted ON teacher.tname = inserted.tname JOIN dbo.course ON course.cname = inserted.cname 我第二次插入值的时候, dbo.TC 还是会出现重复值了。如何避免?

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧