MySQL вставляет уникальную запись по индексу столбцов - PullRequest
2 голосов
/ 09 октября 2011

У меня есть таблица:

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 новой или существующей записи.

Я рассматриваю эти 2 варианта, и не знаю, какой из них лучше, или есть какой-то третий лучший способ сделать это?:

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 Ответ

1 голос
/ 12 октября 2011

Единственный способ получить данные из таблицы в 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 ;

Q: Где в этом утверждении должно быть указано, что требуемый KEY для уникальных вставок - это Keyname =uesrName?

A: MySQL уже знает это, поскольку эта информация является частью определения таблицы.

См .: http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

...