2015-10-19 46 views
3

我有一個完整的培訓表。每個用戶都有一個用戶名。每個用戶可以完成許多課程。MySQL:插入或更新,如果存在,但不是基於關鍵列

該表具有以下標題:

+-------------------------+----------+---------+---------+---------+---------+-----------+ 
| recordnumber (KEY - AI) | username | type | course | status | started | completed | 
+-------------------------+----------+---------+---------+---------+---------+-----------+ 
| int      | varchar | varchar | varchar | varchar | date | date  | 
+-------------------------+----------+---------+---------+---------+---------+-----------+ 

而且我有一個PHP腳本設置填充從CSV分貝上傳。

我想要實現的是它添加新行,並更新現有的。

問題是,recordnumber(它們的鍵,唯一字段)不是恆定的。因此,我不想做一個「ON DUPLICATE KEY」查詢,而是基於用戶名和課程是否已經作爲一行存在。

基本上說:「如果這個用戶名已經有這個過程,更新其他字段。如果用戶名沒有這個過程,那麼把它作爲一個新行添加。

,我都不得不時刻(工作基於鍵)查詢是:

INSERT into table(recordnumber, username,type,course,status,started,completed) values('$data[0]','$data[1]','$data[2]','$data[3]','$data[4]','$data[5]','$data[6]') 

ON DUPLICATE KEY UPDATE username='$data[1]',type='$data[2]',course='$data[3]',status='$data[4]',started='$data[5]',completed='$data[6]' 

對我怎麼能修改查詢任何想法是要檢查基於用戶名和過程,而不是複製來獲得鍵?

謝謝。 :-)

+0

創建自己的「對重複KEY「型功能。你可以利用IF THEN語句來達到這個效果。請參閱:https://dev.mysql.com/doc/refman/5.5/en/if.html – abalos

+0

在用戶名列上創建密鑰,然後在重複密鑰上使用 –

+2

有許多建議和答案建議執行檢查你自己 - 請不要,這些例子中沒有一個是併發安全的 - 這意味着你可以(也很可能會)結束重複記錄。你應該做的是繼續使用'ON DUPLICATE KEY UPDATE'方法,但是你的密鑰是'UNIQUE(username,course)'而不是用戶名。 – Mjh

回答

3

最正確的方法是在用戶名 - 課程列上創建唯一索引並在重複密鑰更新上使用。

顯然,您可以在插入檢查具有相同用戶名和課程的現有記錄之前發出select,並根據需要發出插入或更新。

+0

好喊。這已經解決了這個問題。 :-) 謝謝。 – Tim

1

參考我上面的評論的示例查詢。

IF EXISTS(SELECT id FROM Table WHERE username = '$data[1]' AND course <> '$data[3]') 
(
UPDATE username='$data[1]',type='$data[2]',course='$data[3]',status='$data[4]',started='$data[5]',completed='$data[6]' 
) 
(
INSERT into table(recordnumber, username,type,course,status,started,completed) values('$data[0]','$data[1]','$data[2]','$data[3]','$data[4]','$data[5]','$data[6]') 
) 
3

上創建用戶名,當然列鍵,然後用複製的鑰匙

CREATE TABLE test (
    username varchar(255) NOT NULL, 
    course varchar(255), 
    num_entries INT DEFAULT 0, 
    UNIQUE KEY (username, course) 
); 

insert into test (username, course) values 
('billybob', 'math'), 
('billy', 'math'), 
('billybob', 'math'), 
('bob', 'math') 
ON DUPLICATE KEY UPDATE num_entries = num_entries + 1; 

這是一個簡單的例子,但你應該明白,從這裏

SAMPLE FIDDLE

因此把這個工作放在你的桌子上

ALTER TABLE `courses` -- assuming the table is named courses 
    ADD CONSTRAINT `UK_COURSE_USERNAME` UNIQUE (username, course); 

那麼你插入應該僅僅是一樣的,你有什麼

+0

謝謝,那很有效。 :-) – Tim

1

您可以使用ON DUPLICATE KEY UPDATE如果添加唯一約束的用戶名,當然值對這樣的:

ALTER TABLE `table` ADD CONSTRAINT `UK_table_username_course` UNIQUE (username, course); 
相關問題