2012-02-27 96 views
3

给定两个表:更新如果重复插入?在INSERT上自动增量PK?

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


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

有没有办法来填充Students与每次登记的类的coursenum新列?因此,每次为给定sid添加第二个coursenum时,students.id会自动递增,并保留为主键,而带有sid,fname,lname和new coursenum的新行将添加到表中。

它有点像INSERT ... IF DUPLICATE UPDATE的倒退版本。我想更新...如果重复插入。

+1

这似乎是一件很奇怪的事情想要做。可能想重新考虑你的数据库设计。我希望你在Students表中只有一个ID字段(称为studentID),每个学生一个记录。注册表可以有自己的ID字段,但似乎没有必要。它应该有一个studentID字段和coursenum字段。每个学生每门课一次入学,所以如果三名学生每次上四门课,学生表中将有三个条目,注册表中有12个条目。 – Travesty3 2012-02-27 19:41:59

+0

此外,您可能想使用courseID而不是coursenum,并有另一个关系表,其中包含有关每门课程(名称,编号,教授,学分等)的信息。 – Travesty3 2012-02-27 19:43:46

+0

同意!我无法控制数据库设计,也无法控制这些表中需要这些字段的应用程序。我只是试图找到一种方法来用查询来填充数据,而不是用手来填充。 – Beatrice 2012-02-27 19:44:09

回答

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表中的每个条目插入一个新行。它将保留sid,fnamelname,并将填充新列coursenum
  3. 这也假定您已经将Students表更改为包括coursenum列。
  4. 根据你在这里讨论的学生和课程的数量,这个代码可能不是世界上最快的,但我认为这不是定期完成的事情......更多一次性迁移这种事情。

希望这可以帮助你。

+0

我认为这是一个很好的解决方案。谢谢。 – Beatrice 2012-02-27 22:12:08