我有一张桌子:
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的索引?
谢谢!
答案 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