避免重复行mysql

问题描述:

每当我在我的表上运行插入时,我都想避免重复。如果唯一链接已保存,则应更新该行。在这种情况下可以使用ON DUPLICATE KEY UPDATE?我一直在尝试,但它不会工作避免重复行mysql

id cat_id cat_name     prod_group      link                                                                            
------ ------ ----------------------- ----------------------------- --------------------- 
    1  5 Notebooks     Alienware       /url_to/what_is/unique                                                
    10  5 Notebooks     Latitude      /url_to/what_is/unique                       
    11  3 Desktops     Alienware      /url_to/what_is/unique                      
    12  3 Desktops     Optiplex      /url_to/what_is/unique rquery=na                                      
    20  3 Desktops     Legacy-System     /url_to/what_is/unique rquery=na                     
    21  3 Desktops     Studio      /url_to/what_is/unique rquery=na                       
    22  1 Monitore und Elektronik Axim Electronic    /url_to/what_is/unique %40%2CAxim%2BElectronic&rquery=na               
    27  1 Monitore und Elektronik TV       /url_to/what_is/unique rquery=na                 
    28  2 Handys und Tablets  Tablet      /url_to/what_is/unique rquery=na                 
    29  2 Handys und Tablets  Mobile Device     /url_to/what_is/unique rquery=na             
    30  4 Drucker     Printer      /url_to/what_is/unique               
    31  6 Server und Netzwerk  Cloud Product     /url_to/what_is/unique   

我的查询

$sql="INSERT INTO drivers_cat_copy(cat_id,cat_name,prod_group,link) 
        VALUES('$id','$name','$p','$cat_url')".      
        "ON DUPLICATE KEY UPDATE cat_id='$id',cat_name='$name',prod_group='$p',link='$cat_url'";  

表格属性

CREATE TABLE `drivers_cat_copy` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `cat_id` int(1) DEFAULT NULL, 
    `cat_name` varchar(64) DEFAULT NULL, 
    `prod_group` varchar(64) DEFAULT NULL, 
    `link` varchar(1054) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=77 DEFAULT CHARSET=latin1 
+0

你可以发表表架构和你说的查询不起作用吗? – 2012-08-02 21:13:54

+0

请发布您尝试过的不起作用的内容,以便我们帮助弄清楚为什么它失败。 – 2012-08-02 21:15:19

+0

好了一分钟 – lgt 2012-08-02 21:16:40

你可以写一个存储过程

proc_insert_or_update(VAR1, var2,varN,链接)

如果链接存在 UPDATE查询 ELSE INSERT查询

http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html

+1

作为OP解决方案的存储过程就像用火箭筒杀死蚊子,矫枉过正。 – 2012-08-02 21:52:39

是的,你可以,如果你想与匹配的唯一键的记录更新值使用对重复密钥更新。当然,这意味着你必须在桌面上拥有唯一的键。

'链接'列必须定义为主键或唯一键才能使'插入..重复键更新'语法正常工作。

执行'Describe TableName'语句以打印表格及其关键字的描述。


现在你已经张贴你的表的模式,你可以看到表中只定义了一个密钥,ID列的关键。

你可以这样做:

ALTER TABLE drivers_cat_copy 添加唯一索引link_uniq_index(链接(1054));

但是,它不会很有效率。你应该看看这个问题的第一个答案,以获得更好的解决方案:MySQL: How to alter varchar(255) UNIQUE column to UNIQUE Text NOT NULL?