2011-10-09 54 views
2

我有一個表: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,'[email protected]') 
ON DUPLICATE KEY Ignore 

問:凡在本語句應該被指定爲唯一插入所需的KEY是Keyname = uesrName?

2.

IF EXISTS(SELECT `userName`, `email` FROM user WHERE `userName` = u1 AND `email` = [email protected]) 
BEGIN 

END 
ELSE 
BEGIN 
     INSERT INTO user(`userName`, `email`) 
     VALUES (u1, [email protected]); 
END IF; 

問:在此聲明 - 如何與鍵名索引=用戶應考慮採取?

謝謝!

回答

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 ; 

問:在這個聲明應該在哪裏被指定爲唯一的嵌入式所需的關鍵是鍵名= uesrName?

答:MySQL已經知道這一點,因爲該信息是表定義的一部分。

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