#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