如果不存在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` ;