【发布时间】:2012-02-11 16:45:34
【问题描述】:
我正在构建一个相当简单的网站来跟踪一些工作销售情况。它涉及一个mysql数据库,每个条目都有多个表。在大多数情况下,关系是断断续续的。但是,我有一个 cmets 表,可以为同一次销售存储多个 cmets。我在 cmets 表中有一个与主要销售表的 ID 相关联的外键。我在总表和销售表之间有类似的安排,因为它为同一个 saleID 存储多个总金额。将这些插入数据库的最佳方法是什么?目前,我正在插入 cmets 并获取该行的 ID,然后插入 Gross 并获取 ID,然后使用 cmets id 和 Gross id 将插入到销售表中。有没有比 5 次查询更有效的方法?
--编辑:这是当前代码。我对此很陌生,所以我不得不查找程序以了解您的意思。看起来这基本上就是我正在做的事情,但是为它创建了一个方法,一旦我找出最有效的方法,我就会这样做。
//Prepare the Queries
//Insert Gross Amounts Query
$grossQ = "INSERT INTO gross (commGross, storeGross, manGross, fiGross, flatGross) VALUES ('$commGross', '$storeGross', '$manGross', '$fiGross')";
//Insert Comments Query
$commentsQ = "INSERT INTO comments (comment, dealcomment, grosscomment) VALUES ('$otherComments', '$dealComments', $grossComments')";
//Insert Deal Query
$q = "INSERT INTO sales (make, model, location, vehtype, saletype, manager, county, flat, unitcount, armoramount, controlnumber, salesman, stock) VALUES ('$make', '$model', '$location', '$vehType', '$saleType', '$managerName', '$county', '$flat', '$unitCount', '$armorAmount', '$controlNumber', '$salesmanName1', '$stock')";
//Make database connection
$db = new db('palm_sales');
//Execute gross query and get the id of the row
$db->execute($grossQ);
$grossID = $db->getLastID();
//Execute comments query and get the id of the row
$db->execute($commentsQ);
$commentsID = $db->getLastID();
//Build Main Query
$q = "INSERT INTO sales (make, model, location, vehtype, saletype, manager, gross, comments, county, flat, unitcount, armoramount, controlnumber, salesman, stock) VALUES ('$make', '$model', '$location', '$vehType', '$saleType', '$managerName', '$grossID', '$commentsID', '$county', '$flat', '$unitCount', '$armorAmount', '$controlNumber', '$salesmanName1', '$stock')";
//Execute Main Query
$db->execute($q);
if(mysql_affected_rows() > 0)
{
echo "Success!";
}
else echo "Error: ".mysql_error();
【问题讨论】:
-
你能写一个存储过程吗?
-
你能发布你的代码吗?最有效的方法可能是在触发器之间拆分插入
-
你应该写一个存储过程,或者干脆使用sql事务来确保一切正常。
-
足够高效,恕我直言,在代码中使用它也更容易调试,然后调试 mysql 程序非常困难。但是,我会将它们包装在事务中。
-
我也从未使用过事务,所以我也会在这个项目中玩弄它们。