关于“MySQL 语句级避免重复插入等功能”

上山打伞 发布于 2013/12/27 15:02
阅读 1K+
收藏 2

数据库:option_user


 jsp页面


 
我凌乱了。

 

我想要的功能是:用户(userid=1)选择optionid(1,2,3见上图),如果数据库里有(optionid---userid)就不插入,没有就插入;如果用户没有选择的optionid,数据库里有则删除;

 

麻烦了,望指点。。。

加载中
0
八宝旗
八宝旗

如果表里只有这两列,建联合主键(userid,optionid)

如果数据库里有(optionid---userid)就不插入,没有就插入;

    用insert ignore into

    注意:如果表里还有其他唯一索引触发了冲突,但联合主键没有冲突,也会导致插入失败


如果用户没有选择的optionid,数据库里有则删除;

    delete from xxx where userid=xxx;


0
ericsoul
ericsoul
主键,catch主键报错,返回时提示可能重复。
0
酷酷的就
酷酷的就
很简单啊, 你先全删了,再按选择的插入就行了.
0
huigeer
huigeer
可以设唯一  unique ( userid, optionid)
0
zhangdedezhu
zhangdedezhu
你可以设置唯一  unique (  userid, optionid ),然后在插入的时候 insert ignore into 就可以了
0
优雅先生
优雅先生
INSERT INTO ... ON DUPLICATE KEY UPDATE...
0
开源中国首席保安
开源中国首席保安
虽然效率不高,replace into
0
熟悉的陌生人
熟悉的陌生人

引用来自“无糖咖啡”的答案

虽然效率不高,replace into
靠谱
0
DrunkAlone
DrunkAlone
建立主键就ok了
0
pcxsvl
pcxsvl

可以用触发器:

//1.如果数据库里有(optionid---userid)就不插入,没有就插入;

//其实这一功能只要设userid,optionid为主键即可(关系数据库中元组不能重复,而主键不能重复,只要主键不重复,元组不会重复)

CREATE  TRIGGER   ins1   

BEFORE  INSERT  ON option_user

NEW AS ne1

FOR EACH  ROW

WHEN (

             NOT EXISTS(

                                SELECT *

                                FROM option_user

                                WHERE ne1.userid=userid AND ne1.optionid

                                )

             )

BEGIN ATOMIC
            INSERT INTO option_user(userid,optionid)
            VALUES ( ne1.userid,ne1.optionid)

END

//2.如果用户没有选择的optionid,数据库里有则删除;

//我理解的1。如果optionid为空则删除所有对应如果用户没有选择的optionid,数据库里有则删除相应userid的内容;实现如下;

 CREATE TRIGGER  ins2

 BEFORE INSERT ON option_user

NEW AS ne2

FOR EACH ROW

WHEN(ne2.optionid IS NULL)

DELETE FROM option_user

WHERE userid=ne2.userid

//我理解的2。如果optionid为空则删除所有对应如果用户没有选择的optionid,则不插入;只需设userid,optionid为主键即可(实体完整性规定主键不能为空)

返回顶部
顶部