2012-08-30 188 views
2

我已经看过关于此处的其他问题。它不工作。MySQL程序检查插入之前是否存在记录

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `environment_admin`(
IN environment_id TEXT, 
IN user_id   TEXT, 
IN username   VARCHAR(75), 
IN password   VARCHAR(512) 
) 
BEGIN 
DECLARE env_id INT; 
DECLARE admin_id INT; 

SET env_id = CAST(environment_id AS SIGNED INT); 
SET admin_id = CAST(user_id AS SIGNED INT); 

IF NOT EXISTS(SELECT 1 FROM `environment`.`environment_accounts` WHERE environment_id = env_id AND user_id = admin_id) THEN 
    BEGIN 
    INSERT INTO 
     `environment`.`environment_accounts` 
     (
      `environment_id`, 
      `user_id`, 
      `username`, 
      `password`, 
      `is_active`, 
      `is_admin`, 
      `is_mod` 
     ) 
     VALUES 
     (
      env_id, 
      admin_id, 
      username, 
      password, 
      1, 
      1, 
      1 
     ); 
    END; 
END IF; 
END 

所以,如果我运行:

CALL `environment`.`environment_admin`('22','1','kacieh','512c9ad228332bbd30d09ce7ffb8896e00a1610e914a5fa180bf15ce702b90423e6a9540579f672315ae3c6cb1b8d06ee2b784b4761e806675aa88c2a915553e'); 

我得到0行(S)影响 果然,什么都没有发生。 -_-我一直在这个小时工作 我测试了条件查询,它的工作原理。 我已经测试过存储过程中的insert语句,它也可以。

回答

5

不要这样做,效率低下,如果两个插件同时运行,可能会更糟! :)

使用INSERT ....对重复密钥更新... see here

一个窍门是做对重复密钥更新environment_id = env_id(不改变列,所以什么都不会被更新,确保INSERT不会在没有任何错误的情况下工作,你可能会检查修改/插入行的数量)

+0

但可以有许多相同的environment_id和许多user_id它是一个多对多的关系。虽然不会有相同的environment_id user_id组合。我没有让这对PK,但因为我有其他需要这些记录有一个独特的ID – KacieHouser

+0

这应该工作,如果我有一个独特的索引上的两个字段的组合。我将不得不看看我是否有这个或者在那里。给我几个 – KacieHouser

+1

CREATE UNIQUE INDEX IX_environment_id_user ON环境(environment_id,user_id); – Parallelis

2

我意识到你已经解决了你的问题(Parallelis的答案+1,特别是突出显示并发问题),但以防万一它可以帮助别人...

MySQL可能正在合作在参数environment_iduser_idenvironment_accountsenvironment_iduser_id之间插入。我怀疑这些参数优先于WHERE子句,这意味着只要environment_accounts中至少有一行,NOT EXISTS子句总是会返回false,并且您的插入永远不会运行。

例如,如果你的environment_iduser_id参数分别具有1和2的值,则NOT EXISTS子句将评估为

IF NOT EXISTS(SELECT 1 FROM `environment`.`environment_accounts` WHERE 1 = 1 AND 2 = 2) THEN 

也许值得具有用于您的参数的命名约定(和其他变量),如为参数添加前缀p_

相关问题