Как вы ПРИ ДУБЛИРОВАНИИ КЛЮЧА ОБНОВЛЯЕТЕ информацию о пользователе, не нарушая базу данных?

#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 , которое не затрагивает существующих студентов. У вас есть другая проблема, о которой вы не упомянули, что a name не является уникальной. Если это проблема, вам нужно обработать этот случай, по крайней мере, с уникальным ограничением.

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 это не обновление?