2015-10-19 81 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);