问题是这样的:
在MySQL中向一个表中插入新记录,每次插入的时候必须保证插入的记录不能是重复的。即如果这条记录的所有字段的值都和表中已经存在的一条记录完全相同,则不能插入。常规的做法是每次插入的时候遍历查询整个表,如果没有完全相同的记录就把这条记录插进去,但是这么做好像效率太低了!有没有什么好的方法可以解决这个问题!!请高人指点!!谢谢!
在MySQL中向一个表中插入新记录,每次插入的时候必须保证插入的记录不能是重复的。即如果这条记录的所有字段的值都和表中已经存在的一条记录完全相同,则不能插入。常规的做法是每次插入的时候遍历查询整个表,如果没有完全相同的记录就把这条记录插进去,但是这么做好像效率太低了!有没有什么好的方法可以解决这个问题!!请高人指点!!谢谢!
如果有主键,则可以直接通过错误信息判断。如果SQL返加错误,直接跳过就行了。
http://blog.csdn.net/net_flyfox/archive/2009/03/11/3980731.aspx
/* 数据表 库存帐*/CREATE TABLE InvBalAccount
(
FiscalPeriod char(2) not null /* 会计期间 */,
WareHouseID int not null /* 仓库OID */,
MaterialID int not null /* 货品ID */,
DebQuanAmount decimal(18,8) default 0 not null /* 借方数量发生 */,
CredQuanAmount decimal(18,8) default 0 not null /* 贷方数量发生 */,
CurQuanBalance decimal(18,8) default 0 not null /* 当前数量余额 */,
BatchID int default 0 not null /* 批次ID */,
PurchaseAmount decimal(18,8) default 0 not null /* 采购在途数量*/,
SalesAmount decimal(18,8) default 0 not null /* 销售在途数量*/,
InitOutQuantity decimal(18,8) default 0 not null /* 期初出库数量*/,
constraint InvBalAccount_Key_1 unique (FiscalPeriod, MaterialID, BatchID, WareHouseID) /* Key_1 */
)/*建临时表*/
CREATE TABLE IF NOT EXISTS T_InvValBalAccount(
T_FiscalPeriod char(2) not null /* 会计期间 */,
T_WareHouseID int not null /* 仓库OID */,
T_MaterialID int not null /* 货品ID */,
T_QuanAmount decimal(18,8) default 0 not null /* 贷方数量发生 */,
T_ValueAmount decimal(18,8) default 0 not null /* 贷方金额发生 */,
T_BatchID int default 0 not null /* 批次ID */,
T_onLoadAmount decimal(18,8) default 0 not null /* 销售在途数量*/,
OutType char(1) default '0' not null /* 出库方式 0 不使用,1 先进先出 2 后进先出 3 人工选择 */
)
;/*数据先汇到 T_InvValBalAccount表中,后两个表union 关联实现如下*/ /*插入不存在的*/
INSERT INTO InvBalAccount(FiscalPeriod,WareHouseID,MaterialID,BatchID,DebQuanAmount,CurQuanBalance,PurchaseAmount)
SELECT FiscalPeriod,WareHouseID,MaterialID,BatchID,DebQuanAmount,DebQuanAmount,PurchaseAmount FROM (
SELECT FiscalPeriod,WareHouseID,MaterialID,BatchID,DebQuanAmount,PurchaseAmount,sum(flag)FROM
(SELECT FiscalPeriod,WareHouseID,MaterialID,BatchID,DebQuanAmount,PurchaseAmount,1 AS flag
FROM InvBalAccount INNER JOIN T_invvalbalaccount ON
InvBalAccount.FiscalPeriod=T_invvalbalaccount.T_FiscalPeriod
AND InvBalAccount.WareHouseID=T_invvalbalaccount.T_WareHouseID
AND InvBalAccount.MaterialID=T_invvalbalaccount.T_MaterialID
AND InvBalAccount.BatchID=T_invvalbalaccount.T_BatchID
UNION ALL
SELECT T_FiscalPeriod,T_WareHouseID,T_MaterialID,T_BatchID,T_QuanAmount,T_onLoadAmount,0 AS flag
FROM T_invvalbalaccount)aa
GROUP BY FiscalPeriod,WareHouseID,MaterialID,BatchID
HAVING sum(flag)=0)bb;