有三张表,写一条SQL语句插入这三张表里面数据

时间:2021-12-31 00:51:08
有三张表,写一条SQL语句插入这三张表里面数据,第二张表第三张表都和第一张的ID有主外键关联,请教要怎么写SQL语句,增删改查

16 个解决方案

#1


三张表,一个sql,你怎么也完不成一个insert到三个表吧,要么你写三个sql,要么写个存储过程

#2


删除的时候,先删从表,再删主表

操作均可以利用存贮过程,或者触发器来实现数据的同步更新

#3


引用 1 楼  的回复:
三张表,一个sql,你怎么也完不成一个insert到三个表吧,要么你写三个sql,要么写个存储过程

就是不能用存储过程了,我听着别人说主表用实体类,其它的两张表用Hash把两张从表的传过去,但是听的云里雾里的

#4


引用 3 楼  的回复:
引用 1 楼  的回复:
三张表,一个sql,你怎么也完不成一个insert到三个表吧,要么你写三个sql,要么写个存储过程

就是不能用存储过程了,我听着别人说主表用实体类,其它的两张表用Hash把两张从表的传过去,但是听的云里雾里的

先插入主表,立即查询出来 插入主表的主键,如果主键是GUID 就不需要查了,C#代码就可以得到, 如果主键用的自增 用  SELECT @@IDENTITY,查询,后面2个插入语句都是基于这个主键ID的插入语句,注意事务处理,基本思路就是这样吧

#5


引用 4 楼  的回复:
引用 3 楼 的回复:

引用 1 楼 的回复:
三张表,一个sql,你怎么也完不成一个insert到三个表吧,要么你写三个sql,要么写个存储过程

就是不能用存储过程了,我听着别人说主表用实体类,其它的两张表用Hash把两张从表的传过去,但是听的云里雾里的

先插入主表,立即查询出来 插入主表的主键,如果主键是GUID 就不需要查了,C#代码就可以得到, 如果主键用的自增 用 S……

能不能给点代码

#6


怎么没人呢?给点代码参考

#7


那你改成 用程序来实现咯 依次执行3条SQL。 

#8


- - 一条sql语句  无法完成你的要求- - 
要么用代码第一条写入  读出id  然后根据id去插入后面的

要么存储过程。    类似于第一种  只是你只用调用一下就可以了。

在一种就看你的表 是不是每次都需要    如果是的话  用触发器也可以。 

#9


我自己写的不知道这样写可以不



StringBuilder strSql = new StringBuilder();
            //定义策略ID
            strSql.Append("declare @npsid  int;"); 
            //插入策略表   
            strSql.Append("insert into ME_NewProductStrategy values('" + model.nps_title + "','" + model.nps_cost + "','" + model.product_id + "','" + model.nps_model + "','"
            + model.nps_pack + "','" + model.nps_cost_basic + "','" + model.nps_cost_attribute + "','" + model.nps_cost_pack + "','" + model.nps_cost_materials + "','"
            + model.nps_cost + "','" + model.nps_index + "','" + model.nps_image + "');");
            //获取策略ID
            strSql.Append("select @npsid=@@IDENTITY;select @npsid;");
            //添加原材料组成表
            strSql.Append("insert into ME_NewProductStrategy_Materials values(@pa_id,'"+ mamodel.materials_id + "','" + mamodel.materials_name + "'");
            //添加新产品属性表
            strSql.Append("insert into ME_NewProductStrategy_Attribute values(@pa_id,'" + attmodel.attr_id+ "','" + attmodel.attr_name + "'");

#10


一定要写一个sql语句也可以,用触发器

#11


引用 8 楼  的回复:
- - 一条sql语句  无法完成你的要求- - 
要么用代码第一条写入  读出id  然后根据id去插入后面的

要么存储过程。    类似于第一种  只是你只用调用一下就可以了。

在一种就看你的表 是不是每次都需要    如果是的话  用触发器也可以。


在执行这些SQL 记得使用事务。

#12


引用 9 楼  的回复:
我自己写的不知道这样写可以不

C# code


StringBuilder strSql = new StringBuilder();
            //定义策略ID
            strSql.Append("declare @npsid  int;"); 
            //插入策略表   
            strSql.Append("ins……


在执行这些SQL 记得使用事务。

#13


楼主第一张表的ID是自动生成的还是插入的啊?如果是插入的你可以试试下面的:


 public bool Test_Add(int id,'','')
        {
                     string str = "insert into table1 values(ID,'','')";
                cmd = SqlHelper.CreateDbCommand(str, conn);
                cmd.Parameters.AddRange(parm);
                conn.Open();
                int result = cmd.ExecuteNonQuery();
                return (result > 0) ? true : false;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conn.Close();
            }
        }
if(Test_Add)
{
  string str = "insert into table2 values(,ID,)";
                cmd = SqlHelper.CreateDbCommand(str, conn);
                cmd.Parameters.AddRange(parm);
                conn.Open();
                int result = cmd.ExecuteNonQuery();
 if(result>0)
{
string str = "insert into table3 values(,ID,)";
                cmd = SqlHelper.CreateDbCommand(str, conn);
                cmd.Parameters.AddRange(parm);
                conn.Open();
                int result = cmd.ExecuteNonQuery();

}
               }

 

#14


提供两种常用方法,也是最笨的方法:

1,在ADO.NET中,启用事务,执行3次,3条语句;

2,使用DBMS的触发器,在主键表上建议插入触发器,级联插入数据到另两外键表

#15


自己已经搞定了,谢谢各位

#16


老大  你是怎么搞定的啊 我也想学习学习

#1


三张表,一个sql,你怎么也完不成一个insert到三个表吧,要么你写三个sql,要么写个存储过程

#2


删除的时候,先删从表,再删主表

操作均可以利用存贮过程,或者触发器来实现数据的同步更新

#3


引用 1 楼  的回复:
三张表,一个sql,你怎么也完不成一个insert到三个表吧,要么你写三个sql,要么写个存储过程

就是不能用存储过程了,我听着别人说主表用实体类,其它的两张表用Hash把两张从表的传过去,但是听的云里雾里的

#4


引用 3 楼  的回复:
引用 1 楼  的回复:
三张表,一个sql,你怎么也完不成一个insert到三个表吧,要么你写三个sql,要么写个存储过程

就是不能用存储过程了,我听着别人说主表用实体类,其它的两张表用Hash把两张从表的传过去,但是听的云里雾里的

先插入主表,立即查询出来 插入主表的主键,如果主键是GUID 就不需要查了,C#代码就可以得到, 如果主键用的自增 用  SELECT @@IDENTITY,查询,后面2个插入语句都是基于这个主键ID的插入语句,注意事务处理,基本思路就是这样吧

#5


引用 4 楼  的回复:
引用 3 楼 的回复:

引用 1 楼 的回复:
三张表,一个sql,你怎么也完不成一个insert到三个表吧,要么你写三个sql,要么写个存储过程

就是不能用存储过程了,我听着别人说主表用实体类,其它的两张表用Hash把两张从表的传过去,但是听的云里雾里的

先插入主表,立即查询出来 插入主表的主键,如果主键是GUID 就不需要查了,C#代码就可以得到, 如果主键用的自增 用 S……

能不能给点代码

#6


怎么没人呢?给点代码参考

#7


那你改成 用程序来实现咯 依次执行3条SQL。 

#8


- - 一条sql语句  无法完成你的要求- - 
要么用代码第一条写入  读出id  然后根据id去插入后面的

要么存储过程。    类似于第一种  只是你只用调用一下就可以了。

在一种就看你的表 是不是每次都需要    如果是的话  用触发器也可以。 

#9


我自己写的不知道这样写可以不



StringBuilder strSql = new StringBuilder();
            //定义策略ID
            strSql.Append("declare @npsid  int;"); 
            //插入策略表   
            strSql.Append("insert into ME_NewProductStrategy values('" + model.nps_title + "','" + model.nps_cost + "','" + model.product_id + "','" + model.nps_model + "','"
            + model.nps_pack + "','" + model.nps_cost_basic + "','" + model.nps_cost_attribute + "','" + model.nps_cost_pack + "','" + model.nps_cost_materials + "','"
            + model.nps_cost + "','" + model.nps_index + "','" + model.nps_image + "');");
            //获取策略ID
            strSql.Append("select @npsid=@@IDENTITY;select @npsid;");
            //添加原材料组成表
            strSql.Append("insert into ME_NewProductStrategy_Materials values(@pa_id,'"+ mamodel.materials_id + "','" + mamodel.materials_name + "'");
            //添加新产品属性表
            strSql.Append("insert into ME_NewProductStrategy_Attribute values(@pa_id,'" + attmodel.attr_id+ "','" + attmodel.attr_name + "'");

#10


一定要写一个sql语句也可以,用触发器

#11


引用 8 楼  的回复:
- - 一条sql语句  无法完成你的要求- - 
要么用代码第一条写入  读出id  然后根据id去插入后面的

要么存储过程。    类似于第一种  只是你只用调用一下就可以了。

在一种就看你的表 是不是每次都需要    如果是的话  用触发器也可以。


在执行这些SQL 记得使用事务。

#12


引用 9 楼  的回复:
我自己写的不知道这样写可以不

C# code


StringBuilder strSql = new StringBuilder();
            //定义策略ID
            strSql.Append("declare @npsid  int;"); 
            //插入策略表   
            strSql.Append("ins……


在执行这些SQL 记得使用事务。

#13


楼主第一张表的ID是自动生成的还是插入的啊?如果是插入的你可以试试下面的:


 public bool Test_Add(int id,'','')
        {
                     string str = "insert into table1 values(ID,'','')";
                cmd = SqlHelper.CreateDbCommand(str, conn);
                cmd.Parameters.AddRange(parm);
                conn.Open();
                int result = cmd.ExecuteNonQuery();
                return (result > 0) ? true : false;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conn.Close();
            }
        }
if(Test_Add)
{
  string str = "insert into table2 values(,ID,)";
                cmd = SqlHelper.CreateDbCommand(str, conn);
                cmd.Parameters.AddRange(parm);
                conn.Open();
                int result = cmd.ExecuteNonQuery();
 if(result>0)
{
string str = "insert into table3 values(,ID,)";
                cmd = SqlHelper.CreateDbCommand(str, conn);
                cmd.Parameters.AddRange(parm);
                conn.Open();
                int result = cmd.ExecuteNonQuery();

}
               }

 

#14


提供两种常用方法,也是最笨的方法:

1,在ADO.NET中,启用事务,执行3次,3条语句;

2,使用DBMS的触发器,在主键表上建议插入触发器,级联插入数据到另两外键表

#15


自己已经搞定了,谢谢各位

#16


老大  你是怎么搞定的啊 我也想学习学习