MySQL:INSERT或UPDATE(如果存在),但不基于键列

时间:2015-10-19 13:29:03

标签: mysql sql

我所拥有的是完成培训的表格。每个用户都有一个用户名。每个用户可以完成许多课程。

该表格包含以下标题:

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

我设置了一个PHP脚本来从CSV上传填充数据库。

我想要实现的是添加新行并更新现有行。

问题是recordnumber(它们是key,unique字段)不是常量。因此,我想根据用户名和课程是否已经作为一行存在而不是执行“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]'

有关如何根据用户名和课程而非重复密钥修改查询以进行检查的任何想法?

谢谢。 : - )

4 个答案:

答案 0 :(得分:4)

最正确的方法是在用户名 - 课程列上创建唯一索引,并在重复密钥更新时使用。

显然,您可以在插入检查具有相同用户名和课程的现有记录之前发出选择,并根据需要发出插入或更新。

答案 1 :(得分:4)

在用户名和课程列上创建一个键,然后在复制键上使用

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);

那么你的插入应该和你拥有的一样

答案 2 :(得分: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 :(得分:1)

如果您为用户名和课程值对添加了唯一约束,则可以使用ON DUPLICATE KEY UPDATE

ALTER TABLE `table` ADD CONSTRAINT `UK_table_username_course` UNIQUE (username, course);