【问题标题】:MySQL Insert where not exists does not workMySQL插入不存在的地方不起作用
【发布时间】:2014-12-14 12:49:42
【问题描述】:

下面粘贴的是我的 MySQL 存储过程。

CREATE PROCEDURE `newrig`(
  IN x varchar(10),
  IN y varchar (10),
  IN z varchar(5),
  OUT a INT
)
BEGIN

        INSERT INTO rig (Name, Model,Type)
        SELECT * from (SELECT x,y,z) as tmp
        WHERE NOT EXISTS 
        (SELECT * FROM rig where Name=x
        AND Model=y
        AND Type=z);    
        SELECT LAST_INSERT_ID() INTO a;

END

这就是我从 perl 中调用它的方式

$hDb->do( "call newrig( 'krish','xx','j',\@a);" ); 

结果是;它不会将数据插入表中。有人可以帮忙吗?

【问题讨论】:

  • 第一个猜测是表中已经存在这些值。

标签: mysql perl insert not-exists


【解决方案1】:

开始于:

INSERT INTO rig (Name, Model,Type) values (x,y,z)
    WHERE NOT EXISTS 
    (SELECT * FROM rig where Name=x
    AND Model=y
    AND Type=z);

请注意,如果记录已经存在,那么您为 last_insert_id 获得的值将没有任何意义。

x,y,z 上放置一个唯一键并使用insert ignore 会更好地为您服务。尽管这仍然不会为您提供记录#。


阅读thisthis 了解更多关于如何完成这项工作的信息。

【讨论】:

  • MySQL 要求在 "values(x,y,z)" 之后有一个分号,后跟一个 END。如果没有 where not exists 子句,它对我不起作用。如果记录存在,则插入忽略技术将要求我检查最后一个插入 ID。
  • 另外,我想知道如果我的主键设置为自动递增并且 PK 是记录的唯一键,INSERT IGNORE 是否会忽略插入。
猜你喜欢
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 2011-08-27
  • 2013-11-30
相关资源
最近更新 更多