2015-10-18 68 views
-1

我使用MSSQL服务器8 /经典ASP使用VBScriptMSSQL INSERT INTO愁楚

我有表名为web_hist,与两列cust_noitem_no, 主键是CUST_NO + ITEM_NO。

表包含目前约80000条记录

  • 当客户在我的网站的订单他的顺序存储在表(临时)称为orders。该表格还包含字段cust_noitem_no

  • 在客户退房后,我会很简单地将上面的两个字段插入web_hist表中,以便为每个订购的记录跳过任何现有记录。

我正在寻找一个SQL语句,我可以使用它来实现上述目标,而不会产生'重复密钥!'错误

+1

我会建议使用标识列作为主键。您的重复键错误很可能是由您的数据中的重复键造成的。你的帖子表明你桌子上的PK是cust_no + item_no?你将这些值加在一起吗?或者你的意思是cust_no,item_no?在任何一种情况下,数据集中的任何值(或表中已存在的值)都将导致dup键错误。 –

+0

Didi你试试看吗?我有,请告诉我们您的试验 –

回答

0

您不应将客户编号+料号作为主键,因为一位客户可以多次购买同一料品。

您可以使用客户号码+订单号码,因为客户将拥有一个订单的唯一订单号码。

+0

谢谢你的答案 – Dory550

+0

谢谢你的答案 貌似我没有澄清足够 – Dory550

+0

对不起..我是一个newbee在这个论坛 它看起来像我没有澄清足够 表'web_hist'只是客户过去购买的所有商品的历史清单 它用于显示客户的历史,从而允许他从他的商品列表中下订单 我们是批发商和我们的客户反复屡次购买每件商品并经常购买 对不起,请谅解 Dory – Dory550

1

这是相当简单的测试,如果使用相同的cust_noitem_no记录在web_hist表中存在插入记录之前,但是这意味着客户将只允许订购的任何项目只有一次。在我看来,除非你真的希望发生这种情况,否则你应该重新考虑你的表格设计。

你应该选择保留主键是,你应该做这样的事情:

IF NOT EXISTS (
    SELECT 1 
    FROM web_hist 
    WHERE cust_no = @cust_no 
    AND item_no = @item_no 
) 
BEGIN 
    INSERT INTO web_hist (cust_no, item_no) VALUES @cust_no, @item_no) 
END 
/* optional 
ELSE 
BEGIN 
    -- Show a message to the customer that he already ordered this item. 
END 
*/