如果不存在MySQL插入(不使用主键)
如果对不存在,如何插入到行中?如果不存在MySQL插入(不使用主键),mysql,sql,Mysql,Sql,如果对不存在,如何插入到行中? *注意:这些不是主键,我的主键设置为自动递增 尝试插入忽略,但无效 INSERT IGNORE INTO mytable (`myid`, `theirid`) VALUES ('5', '1') ON DUPLICATE KEY <DO NOTHING> 取决于您运行此查询(以及其他一些环境元素)的频率,但我认为在这些字段上创建唯一索引是有意义的。这样,如果它们是重复的,mysql只会返回重复的错误代码,而不会将其添加到表中。此外,考虑到如果插入的
*注意:这些不是主键,我的主键设置为自动递增
尝试插入忽略,但无效
INSERT IGNORE INTO mytable (`myid`, `theirid`) VALUES ('5', '1')
ON DUPLICATE KEY <DO NOTHING>
取决于您运行此查询(以及其他一些环境元素)的频率,但我认为在这些字段上创建唯一索引是有意义的。这样,如果它们是重复的,mysql只会返回重复的错误代码,而不会将其添加到表中。此外,考虑到如果插入的值是重复的,它不必检查整个数据库,因此它将使此查询执行得更快。我想您不清楚on duplicate的用法。。。。 使用它的想法是,如果字段是重复的,则将旧字段替换为新字段,或者只是更改主键以使其唯一。。。您不能这样做,因为默认情况下,复制时的
不会执行任何操作,它不会插入。看看这里
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语句。1)能否在(myid,theirid)
上添加唯一的约束?如果是,请添加此约束并使用:
INSERT INTO mytable (myid, theirid)
VALUES (5, 1) ;
并忽略生产警告(或将上述内容替换为插入忽略)
2) 如果您无法添加此类约束(例如,您有时希望允许此类重复项,有时不允许),则可以使用以下方法:
INSERT INTO mytable (myid, theirid)
SELECT 5, 1
FROM dual
WHERE NOT EXISTS
( SELECT *
FROM mytable
WHERE myid = 5
AND theirid = 1
) ;
重复验证(1062)仅在其索引为唯一的情况下才会在密钥上引发。它引发的验证被“在重复密钥上”(ie 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` ;
问题是,如果该行已经存在,您想做什么?@jcho360是的,需要替换为一个命令来执行任何操作。我认为您需要查看复制键上与列关联的内容。除了INSERT IGNORE,我不认为它在做你认为它在做的事情。@JohnP不确定你的意思,只是提醒你这两列myid
,theirid
不是主键,这就是为什么我说再看一遍。复制主键或索引字段时使用on duplicate key,而不是复制两个随机列时使用on duplicate key。这与您现在的操作方式几乎无关。我有一个id
列,自动计数作为主键。如果是这样的话,SQL命令会是什么样子?从列1='5'和列2='1'的_表中选择COUNT(*)作为total;如果total=0,则插入,否则不执行任何操作。我想您可以将所有内容合并到一个查询中,但我不确定这种语法。@tq:很抱歉,我回复得太晚了。一些脚本没有加载,因此该网站暂时无法为我工作。我假设您有一个包含PK、myid和yourid的联接表。如果你在myid上添加一个唯一的聚集索引,你的ID将防止双重插入。如果我有重复的值,如(5,1)(5,2)(5,3),这是否有效@tq:如果你将它作为一个聚集索引,如(5,1)、(5,2)的值将不会触发重复错误。如果不正确地创建了唯一索引,那么它会更快地抛出该错误。很容易检查您是否正确构建索引,因为如果您做得不对,它甚至可能不允许您构建索引。我的主键设置为自动递增,我不会这样更新它。重点是,如果您正在更新主键,则“在重复键上”设计为工作。因为您没有,所以不需要在查询中包含它,这就是为什么我说它与您正在做的事情无关?请在您的问题中添加SHOW CREATE TABLE mytable
输出。您是否尝试了第二个查询(是否将两个值(5和2)都放在了这两个位置?不要出错,我在php ini集合中有这个('display_errors',1);错误报告(E_ALL | E| E| STRICT);什么是dual
表?
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` ;