MySQL вставить уникальную запись по индексу столбцов

#mysql #insert #indexing #unique

#mysql #вставить #индексирование #уникальный

Вопрос:

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

 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
  

Вопрос: Где в этом заявлении должно быть указано, что требуемый КЛЮЧ для уникальных вставок — 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:

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

Вопрос: Где в этом заявлении должно быть указано, что требуемый КЛЮЧ для уникальных вставок — Keyname = uesrName?

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

Смотрите: http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html