【问题标题】:MySQL insert unique record by index of columnsMySQL按列索引插入唯一记录
【发布时间】:2011-12-03 21:53:33
【问题描述】:

我有一张桌子:

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 语句以最快的方式插入新的 unique 记录。 语句应返回新记录或现有记录的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 的索引?

谢谢!

【问题讨论】:

    标签: mysql insert indexing unique


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多