程序外键sql

时间:2016-02-03 16:54:48

标签: sql sql-server tsql foreign-keys

我无法理解为什么执行此程序不起作用:

CREATE PROCEDURE Pro1
( 
    @factura_id int, @produs_id int, @pret float, @cantitate int,@nr_ordine int
)
as
begin
    if((select COUNT (id_produs) from Produse where id_produs=@produs_id)=1)
        update FacturaProdus set 
          id_factura=@factura_id,  
          id_produs=@produs_id,
          pret =@pret,
          cantitate = CONCAT ('-',convert(int,@cantitate)), 
          nr_ordine=@nr_ordine
    --where id_produs=@produs_id
else

    insert into FacturaProdus(id_factura,id_produs,pret,cantitate,nr_ordine) 
    values(@factura_id,@produs_id,@pret, @cantitate,@nr_ordine)

end
go

如果id_produs与arg @produs_id不同,则在表FacturaProdus中放入相应的值。例如:

exec Pro1 1,1,1,12,2

它在表FacturaProdus中更新了cantitate的负值和arguments所给出的所有值.Good.But for:

exec Pro1 1,2,1,12,2 

它给出了我的错误:

  

INSERT语句与FOREIGN KEY约束“FK_fac2”冲突。冲突发生在数据库“VanzariP1”,表“dbo.Produse”,列'id_produs'。

为什么呢?为什么它不能只从exec arg中放入表中的值? 有什么建议吗?

1 个答案:

答案 0 :(得分:0)

嗯,错误文本非常明显:您在FacturaProdus表上有外键约束,强制FacturaProdus.id_produs列引用Produse.id_produs列中的值。

因此,如果您尝试使用@produs_id表中缺少的Produse调用存储过程,则必须在Produse之前将具有此ID和一些数据的记录插入insert into FacturaProdus --where id_produs=@produs_id存储过程的声明。

另请注意,语句FacturaProdus中注释掉的部分非常危险,因为您将使用提供给存储过程的值更新整个var someText = "this string is longer than 14 characters"; if(someText.length > 14){ someText = ""; } 表。

我真的怀疑这样的更新是你的意图。