MySQL:插入或更新(如果存在,但不基于键列)

Tim*_*Tim 6 mysql sql

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

该表具有以下标题:

+-------------------------+----------+---------+---------+---------+---------+-----------+
| recordnumber (KEY - AI) | username |  type   | course  | status  | started | completed |
+-------------------------+----------+---------+---------+---------+---------+-----------+
| int                     | varchar  | varchar | varchar | varchar | date    | date      |
+-------------------------+----------+---------+---------+---------+---------+-----------+
Run Code Online (Sandbox Code Playgroud)

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

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

问题是记录号(它们的键,唯一字段)不是恒定的。因此,我不想执行“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]'
Run Code Online (Sandbox Code Playgroud)

关于如何修改查询以使其根据用户名和课程而不是重复键进行检查的任何想法?

谢谢你。:-)

Sha*_*dow 6

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

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


Joh*_*ell 5

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

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;
Run Code Online (Sandbox Code Playgroud)

这是一个简单的示例,但您应该从这里了解要做什么

样品小提琴

所以把它放在你的桌子上

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

那么您的插入应该与您拥有的相同