【问题标题】:UPDATE IF DUPLICATE INSERT? w autoincrement PK on INSERT?如果重复插入更新? w 在 INSERT 上自动增加 P​​K?
【发布时间】:2012-02-27 19:35:09
【问题描述】:

给定两个表:

`Students`
id         int, primary, auto-increment
sid        int
fname      varchar
lname      varchar


`Registration`
id          int, primary, auto-increment
student_sid int
coursenum   int

有没有办法在Students 的新列中填充他们注册的每个课程的课程编号?因此,每次为给定的 sid 添加第二个 coursenum 时,students.id 将自动递增,保留主键,同时将带有 sid、fname、lname 和新 coursenum 的新行添加到表中。

这有点像 INSERT...IF DUPLICATE UPDATE 的向后版本。我想要更新...如果重复插入。

【问题讨论】:

  • 这似乎是一件非常奇怪的事情。可能要重新考虑您的数据库设计。我希望您在学生表中只有一个 ID 字段(称为 studentID),每个学生一条记录。注册表可以有自己的 ID 字段,但似乎没有必要。它应该有一个 studentID 字段和一个 coursenum 字段。每门课程每个学生一个条目,因此如果三个学生每人参加四门课程,则学生表中将有 3 个条目,而注册表中将有 12 个条目。
  • 此外,您可能希望使用 courseID 而不是 coursenum,并拥有另一个关系表,其中包含有关每门课程的信息(名称、编号、教授、学分等)。
  • 同意!我无法控制数据库设计,也无法控制需要这些表中的这些字段的应用程序。我只是想找到一种方法来使用查询而不是手动填充数据。
  • 你会用PHP吗?

标签: mysql sql sql-update sql-insert


【解决方案1】:

也许你可以做这样的事情(见下面的注释):

    $result = mysql_query("SELECT DISTINCT student_sid from Registration");
while (list($studentID) = mysql_fetch_row($result))
{
    $result2 = mysql_query("SELECT fname, lname FROM Students WHERE sid = '{$studentID}'");
    list($fname, $lname) = mysql_fetch_row($result2);

    mysql_query("DELETE FROM Students WHERE sid = '{$studentID}'");
    mysql_query("INSERT INTO Students (sid, fname, lname, coursenum) SELECT '{$studentID}', '{$fname}', '{$lname}', coursenum FROM Registration WHERE student_sid = '{$studentID}'");
}

这里有几点说明:

  1. 此代码未经测试,但我认为它应该可以正常工作。
  2. 这不会保留Students 表中的原始id 列。它将获取名字和姓氏,然后删除学生,并为Registration 表中的每个条目插入一个新行。它将保留sidfnamelname,并将填充一个新列coursenum
  3. 这还假设您已经更改了Students 表以包含coursenum 列。
  4. 根据您在这里谈论的学生和课程的数量,此代码可能不是世界上最快的,但我假设这不会定期执行...更多一次性迁移之类的。

希望对您有所帮助。

【讨论】:

  • 我认为这是一个很好的解决方案。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-10-14
  • 2012-11-16
  • 2014-01-12
  • 2016-08-17
  • 2011-08-20
  • 2015-07-04
  • 1970-01-01
相关资源
最近更新 更多