ОБНОВИТЬ, ЕСЛИ ДУБЛИК ВСТАВИТЬ? w автоинкремент PK при INSERT?

Даны две таблицы:

`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 добавлялся второй номер курса, student.id автоматически увеличивался, оставаясь первичным ключом, а в таблицу добавлялась новая строка с sid, fname, lname и новым номером курса.

Это похоже на обратную версию INSERT...IF DUPLICATE UPDATE. Я хочу ОБНОВИТЬ... ЕСЛИ ДУБЛИКАЦИЯ ВСТАВИТЬ.


person Beatrice    schedule 27.02.2012    source источник
comment
Это кажется действительно странным желанием сделать это. Возможно, вы захотите переосмыслить дизайн вашей базы данных. Я ожидаю, что у вас будет только одно поле идентификатора (назовем его studentID) в таблице «Студенты», по одной записи на студента. Таблица регистрации могла бы иметь собственное поле ID, но это кажется ненужным. Он должен иметь поле studentID и поле Coursenum. Одна запись на каждого студента на курс, поэтому, если три студента посещают четыре класса каждый, в таблице «Студенты» будет три записи и 12 записей в таблице «Регистрация».   -  person Travesty3    schedule 27.02.2012
comment
Кроме того, вы можете использовать идентификатор курса вместо номера курса и иметь другую реляционную таблицу, содержащую информацию о каждом курсе (имя, номер, профессор, кредиты и т. д.).   -  person Travesty3    schedule 27.02.2012
comment
Согласованный! У меня нет контроля ни над дизайном базы данных, ни над приложением, которому нужны эти поля из этих таблиц. Я просто пытаюсь найти способ заполнить данные запросом, а не вручную.   -  person Beatrice    schedule 27.02.2012
comment
Умеете ли вы использовать PHP?   -  person Travesty3    schedule 27.02.2012


Ответы (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. Это не сохранит исходный столбец id из таблицы Students. Он получит имя и фамилию, затем удалит учащегося и вставит новую строку для каждой записи в таблице Registration. Он сохранит sid, fname и lname и заполнит новый столбец coursenum.
  3. Это также предполагает, что вы уже изменили таблицу Students, включив в нее столбец coursenum.
  4. В зависимости от количества студентов и курсов, о которых вы здесь говорите, этот код может быть не самым быстрым в мире, но я предполагаю, что это не то, что будет делаться регулярно... скорее разовый миграционная штука.

Надеюсь, это поможет вам.

person Travesty3    schedule 27.02.2012
comment
Я думаю, что это отличное решение. Спасибо. - person Beatrice; 28.02.2012