MySQL按列索引插入唯一记录

时间:2011-10-09 10:34:10

标签: mysql insert indexing unique

我有一张桌子:

table user(
  id_user,
  userName,
  email,
  primary key(id_user)
);

我在其上添加了唯一索引:

alter table user add unique index(userName, email);

现在我在桌子上有两个索引:

Index:
Keyname     Unique      Field   
PRIMARY     Yes         id_user
userName    Yes         userName, email

任务是找到MySQL语句,以便以最快的方式插入新的唯一记录。 声明应返回新记录或现有记录的Id_user

我正在考虑这两个选项,并且不知道哪个更好或者有更好的第三种方法吗?:

1

INSERT INTO `user` (`userName`, `email`)
VALUES (u1,'u1@email.me' )
ON DUPLICATE KEY Ignore

问:在此语句中应指定唯一插入所需的KEY是Keyname = uesrName吗?

2

IF EXISTS(SELECT `userName`, `email` FROM user WHERE `userName` = u1 AND `email` = u1@email.me)
BEGIN

END
ELSE
BEGIN
      INSERT INTO user(`userName`, `email`)
      VALUES (u1, u1@email.me);
END IF;

问:在此声明中 - 应该如何考虑使用Keyname = userName的索引?

谢谢!

1 个答案:

答案 0 :(得分:1)

从MySQL中的表中获取数据的唯一方法是选择。

DELIMITER $$

CREATE FUNCTION ForceUser(pUsername varchar(255), pEmail varchar(255)) 
RETURNS integer
BEGIN
  DECLARE MyId INTEGER;

  /*First do a select to see if record exists:*/
  /*because (username,email) is a unique key this will return null or a unique id.*/
  SELECT id INTO MyId FROM user 
  WHERE username = pUsername 
    AND email = pEmail;
  IF MyId IS NULL THEN 
    /*If not then insert the record*/
    INSERT INTO user (username, email) VALUES (pUserName,pEmail);
    SELECT LAST_INSERT_ID() INTO MyId;
  END IF;
  RETURN MyID;
END $$

DELIMITER ;
  

问:在此语句中应该指定唯一插入所需的KEY是Keyname = uesrName吗?

答:MySQL已经知道这一点,因为该信息是表定义的一部分。

请参阅:http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html