#mysql #sql
Вопрос:
У меня есть простая таблица со студентами в базе данных MySQL. Похоже на:
student_id | имя студента | teacher_id |
---|---|---|
1 | Адам | 100 |
2 | Боб | 100 |
3 | Карл | 100 |
4 | Dan | 200 |
Преподаватели могут вводить новых студентов или изменять имена существующих студентов. В настоящее время у меня есть эта настройка для обновления через:
INSERT INTO student_list (name) VALUES (:name) ON DUPLICATE KEY UPDATE student name= values(name)
Проблема в том, что это полностью нарушает все связанные идентификаторы учащихся в других таблицах (поскольку ОБНОВЛЕНИЕ С ДУБЛИКАТОМ КЛЮЧА изменяет идентификатор учащегося). Я мог бы просмотреть каждую запись перед обновлением, но это кажется грязным. Конечно, есть лучший способ.
CREATE TABLE `sabrep_db`.`students` ( `student_id` INT NOT NULL AUTO_INCREMENT , `name` TEXT NOT NULL , `teacher_id` INT NOT NULL , PRIMARY KEY (`student_id`)) ENGINE = InnoDB; INSERT INTO `students` (`student_id`, `name`, `teacher_id`) VALUES (NULL, 'Adam', '100'), (NULL, 'Bob', '100');
Комментарии:
1. Пожалуйста, отредактируйте вопрос и определите, для какой базы данных он предназначен. Это также помогает опубликовать полное повторение (создание таблицы, вставка данных, расшифровка, если фактический результат, описание требуемого результата). Я не знаком с синтаксисом, но, поскольку вы только появляетесь, чтобы обновить имя, я не понимаю, почему это изменит существующий идентификатор.
2. Можете ли вы объяснить поведение тестового примера, который вам не нравится? В этом не было ничего необычного. Не было никакого поведения при обновлении. Две строки были вставлены с уникальным первичным ключом. Единственный способ обновить имя студента-это либо
UPDATE
напрямую, либо сINSERT
помощью существующегоstudent_id
. Если вы простоINSERT
name
ставите » а » и не указываете явноеstudent_id
, вы получаете новоеstudent_id
, которое не затрагивает существующих студентов. У вас есть другая проблема, о которой вы не упомянули, что aname
не является уникальной. Если это проблема, вам нужно обработать этот случай, по крайней мере, с уникальным ограничением.3. Ваш вопрос не описывает SQL, который делает то, о чем вы беспокоитесь. Он
INSERT INTO students (name) VALUES (:name) ON DUPLICATE KEY UPDATE student name= values(name);
вообще не может (не может) изменять первичный ключ. Этот видINSERT
просто создает новый первичный ключ на основе поведения auto_increment. Я не уверен, чтоstudent_list
это такое. Это может быть опечатка в вопросе. Настройте вопрос так, чтобы он содержал тестовый случай, демонстрирующий поведение, которое вам не нравится.
Ответ №1:
Следует также передать ключ (обычно первичный ключ) как часть вставки, чтобы он знал ссылку на ключ для обновления, когда есть дубликат, имя передается дважды для части обновления:
INSERT INTO student_list (student_id, name) VALUES (:student_id, :name) ON DUPLICATE KEY UPDATE student_name = :name;
Комментарии:
1. Разве это не было бы действительно небезопасно? Злонамеренный учитель может вручную изменить ученика
2. Разве
or change existing student's names
это не обновление?