关于MYSQL中插入新记录的有关问题
关于MYSQL中插入新记录的问题
问题是这样的:
在MySQL中向一个表中插入新记录,每次插入的时候必须保证插入的记录不能是重复的。即如果这条记录的所有字段的值都和表中已经存在的一条记录完全相同,则不能插入。常规的做法是每次插入的时候遍历查询整个表,如果没有完全相同的记录就把这条记录插进去,但是这么做好像效率太低了!有没有什么好的方法可以解决这个问题!!请高人指点!!谢谢!
------解决方案--------------------
如果用MYSQL,参考REPLACE命令
REPLACE works exactly like INSERT, except that if an old row in the table has the same value as a new row for a PRIMARY KEY or a UNIQUE index, the old row is deleted before the new row is inserted
------解决方案--------------------
利用主键来判断插入数据是否重复,把有可能会重复的字段设为主键。当然也可以利用唯一索引
至于楼主说的判断表中两条数据完全相同,就是每个字段都相同,我虽然不太明白这样的规则为什么会在一个表中出现。但既然你要使每个字段的值不冲突,那只能将所有字段组合设为主键了。
P.S. 奇怪的应用呵呵
------解决方案--------------------
不知是不是我写的这个问题
http://blog.****.net/net_flyfox/archive/2009/03/11/3980731.aspx
问题是这样的:
在MySQL中向一个表中插入新记录,每次插入的时候必须保证插入的记录不能是重复的。即如果这条记录的所有字段的值都和表中已经存在的一条记录完全相同,则不能插入。常规的做法是每次插入的时候遍历查询整个表,如果没有完全相同的记录就把这条记录插进去,但是这么做好像效率太低了!有没有什么好的方法可以解决这个问题!!请高人指点!!谢谢!
------解决方案--------------------
如果用MYSQL,参考REPLACE命令
REPLACE works exactly like INSERT, except that if an old row in the table has the same value as a new row for a PRIMARY KEY or a UNIQUE index, the old row is deleted before the new row is inserted
------解决方案--------------------
利用主键来判断插入数据是否重复,把有可能会重复的字段设为主键。当然也可以利用唯一索引
至于楼主说的判断表中两条数据完全相同,就是每个字段都相同,我虽然不太明白这样的规则为什么会在一个表中出现。但既然你要使每个字段的值不冲突,那只能将所有字段组合设为主键了。
P.S. 奇怪的应用呵呵
------解决方案--------------------
不知是不是我写的这个问题
http://blog.****.net/net_flyfox/archive/2009/03/11/3980731.aspx
- SQL code
/* 数据表 库存帐*/ 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;