MySQL INSERT如果不存在(不使用主键)

时间:2012-07-06 20:14:22

标签: mysql sql

如果不存在,我怎么能插入一行? *注意这些不是主键,我的主键设置为自动增量

尝试插入忽略但没有工作

INSERT IGNORE INTO mytable (`myid`, `theirid`) VALUES ('5', '1')
ON DUPLICATE KEY <DO NOTHING>

表格如下:

CREATE TABLE `mytable` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    `myid` bigint(20) NOT NULL,
    `theirid` bigint(20) NOT NULL,
    `activated` tinyint(1) NOT NULL DEFAULT '0',
    `dateStamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1$$

4 个答案:

答案 0 :(得分:12)

1)您可以在UNIQUE上添加(myid, theirid)约束吗?如果是,请添加此约束并使用:

INSERT INTO mytable (myid, theirid) 
  VALUES (5, 1) ;

并忽略产品警告(或将上面的内容替换为INSERT IGNORE

2)如果你不能添加这样的约束(例如,你有时想要允许这样的重复,有时你不允许),你可以使用这个:

INSERT INTO mytable (myid, theirid) 
  SELECT 5, 1 
  FROM dual 
  WHERE NOT EXISTS
        ( SELECT *
          FROM mytable
          WHERE myid = 5
            AND theirid = 1
        ) ; 

答案 1 :(得分:1)

我认为你不清楚重复的事情.... 使用它的想法是如果该字段是重复的,将旧的替换为新的或只是更改主键使其独特...你不能做,on duplicate do nothing因为默认它不会什么也不做,它不会插入。看看这里

mysql> insert into t2 values (20000,'a','a',0);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t2 values (20000,'a','a',0);
ERROR 1062 (23000): Duplicate entry '20000' for key 'PRIMARY'

所以它没有做什么&#39;。如果您想知道该值是否存在,则应在Insert之前使用Select语句。

答案 2 :(得分:1)

重复执行(1062)仅在密钥上被引用,如果它被索引为唯一的,它会提高由“ON DUPLICATE KEY”捕获的执行(即1062)

你可以做的是添加一个复合键UNIQUE(myidtheirid)如果你想要在两者都是togetter时引发异常,或者只是你想要或者单独添加它们

但我不确定语法,所以只需查看它,但它看起来像这样......

CREATE TABLE `mytable` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    `myid` bigint(20) NOT NULL,
    `theirid` bigint(20) NOT NULL,
    `activated` tinyint(1) NOT NULL DEFAULT '0',
    `dateStamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),  UNIQUE(`a`,`b`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1$$

INSERT myid, theirid VALUES ('4' , '1') into mytable 
ON DUPLICATE KEY 
UPDATE `myid`,`theirid` ; 

答案 3 :(得分:0)

取决于您运行此查询的频率(以及其他一些环境元素),但我想说在这些字段上创建唯一索引是有意义的。这样,如果它们是重复的,mysql将只返回一个重复的错误代码,而不是将其添加到表中。此外,如果插入的值是重复的,考虑到它不必检查整个数据库,它将使这个查询执行得更快。