AUTO_INCREMENT первичный ключ и обновлять его ссылки в других таблицах одновременно - PullRequest
0 голосов
/ 01 мая 2018

У меня есть основная таблица учеников и несколько других таблиц, в которых есть ссылка student_id. Мне нужно изменить student_id (который является первичным ключом) в основной таблице учеников на

ALTER TABLE `student` AUTO_INCREMENT = 72805;

И заменить все ссылки student_id во всех таблицах (включая основную таблицу студентов), начиная с 72805. Есть ли способ сделать это?

стол ученический

student_id   student_name
    1           Sarah
    2           John
    3           Peter

таблица классов

class_id    student_id
        340         2
        432         1
        127         3

активность

activity_id     student_id
    105             1
    106             1
    205             2
    207             2
    217             3

книжный стол

boook_id    student_id
    105         1
    106         1
    205         2
    207         2
    217         3

1 Ответ

0 голосов
/ 01 мая 2018

Необходимо удалить ограничения внешнего ключа для Класса, Действия и Книг и заново создать их с предложением ON UPDATE CASCADE.

SHOW CREATE TABLE class;
SHOW CREATE TABLE activity;
SHOW CREATE TABLE books;

Здесь будут показаны имена ограничений внешнего ключа. Вам понадобится имя ограничения внешнего ключа на student_id.

ALTER TABLE class DROP FOREIGN KEY [enter the foreign key name here], ADD CONSTRAINT [enter foreign key name here] FOREIGN KEY (`student_id`) REFERENCES student (`student_id`) ON UPDATE CASCADE;
ALTER TABLE activity DROP FOREIGN KEY [enter the foreign key name here], ADD CONSTRAINT [enter foreign key name here] FOREIGN KEY (`student_id`) REFERENCES student (`student_id`) ON UPDATE CASCADE;
ALTER TABLE books DROP FOREIGN KEY [enter the foreign key name here], ADD CONSTRAINT [enter foreign key name here] FOREIGN KEY (`student_id`) REFERENCES student (`student_id`) ON UPDATE CASCADE;

Это говорит MySQL, что если вы обновите student_id в таблице учеников, чтобы обновить значение в ссылочных таблицах. В зависимости от вашей бизнес-логики зависит от того, сохраняете ли вы предложение ON UPDATE CASCADE. Я никогда не использую его лично, потому что редко вы обновляете первичный ключ. Если у вас нет внешних ключей, вы должны удалить предложение drop и оставить предложение add.

Структура создана, чтобы теперь обновлять ваш student_id и каскадировать его с другими таблицами.

UPDATE student SET student_id = student_id + 72804; -- Minus 1 because the values already in here start at 1, not 0.

Вы не хотите устанавливать auto_increment равным 72805, потому что именно здесь вы хотите, чтобы первая запись начиналась с start , и теперь у вас есть строка, занимающая это значение. Этот запрос вернет вам значение, которое вы теперь должны установить для значения auto_increment.

SELECT MAX(student_id) + 1 FROM student;

Теперь запустите оператор таблицы ALTER и установите для auto_increment значение, которое вы получили из вышеприведенного запроса.

ALTER TABLE student AUTO_INCREMENT = [Value you receive from the SELECT MAX()].

Когда это будет сделано, я бы сбросил и заново создал внешние ключи без КАДКА ОБНОВЛЕНИЯ ОБНОВЛЕНИЯ.

ALTER TABLE class DROP FOREIGN KEY [enter the foreign key name here], ADD CONSTRAINT [enter foreign key name here] FOREIGN KEY (`student_id`) REFERENCES student (`student_id`);
ALTER TABLE activity DROP FOREIGN KEY [enter the foreign key name here], ADD CONSTRAINT [enter foreign key name here] FOREIGN KEY (`student_id`) REFERENCES student (`student_id`);
ALTER TABLE books DROP FOREIGN KEY [enter the foreign key name here], ADD CONSTRAINT [enter foreign key name here] FOREIGN KEY (`student_id`) REFERENCES student (`student_id`);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...