10

如果该对不存在,我如何插入一行?
* 注意这些不是主键,我的主键设置为自动递增

尝试插入忽略但不起作用

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

4 回答 4

13

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
        ) ; 
于 2012-07-06T20:38:49.603 回答
1

我认为您不清楚 on duplicate 确实......不能做,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'

所以它“什么也没做”。如果您想知道该值是否存在,您应该在插入之前使用 Select 语句。

于 2012-07-06T20:29:05.427 回答
1

重复的异常(1062)仅在其索引为唯一时才会在键上引发,它会引发异常女巫被“ON DUPLICATE KEY”(即1062)捕获

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

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

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` ; 
于 2013-08-07T17:13:56.497 回答
0

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

于 2012-07-06T20:27:20.330 回答