如果对不存在,我怎么能插入一行?
*注意这些不是主键,我的主键设置为自动增量
尝试插入忽略但没有工作
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$$
答案 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(myid
,theirid
)如果你想要在两者都是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将只返回一个重复的错误代码,而不是将其添加到表中。此外,如果插入的值是重复的,考虑到它不必检查整个数据库,它将使这个查询执行得更快。