MySQL и идентификаторы отредактированы вручную

Я пытаюсь объяснить свою ситуацию на простом примере. Ive два стола players и goals. В голах я сохраняю цели за год для каждого игрока, к которому я присоединяюсь следующим образом:

SELECT goals_02, goals_03, goals_04 ecc FROM goals WHERE goals_id = '$player_id';

Таким образом, target_id и player_id должны быть одинаковыми. Пока нет проблем. Из-за некоторых проблем с моим php-кодом я сделал несколько экспериментов, а между запросом и другим, идентификаторы продолжали создавать эту ситуацию:

Таблица игроков

player_id | player_name
1 | Aaron *******
2 | Abdel El-Saqua
3 | Abdullah Zubromawi
4 | experiment1
5 | test

После решения проблем я снова начал добавлять игроков, но не зная, как начать повторную нумерацию идентификаторов с того места, где я остановился, я вручную отредактировал новые идентификаторы из phpmyadmin... поэтому я добавил Abdulrahim Jumaa и изменил его идентификатор с 6 (автоматически присвоенный mysql) до 4, и я сделал то же самое с таблицей целей.

Моя проблема заключается в том, что теперь MySQL не связывает идентификаторы, кажется, что player_id и goal_id отличаются друг от друга... Возможно, существует какой-то кеш, где mysql сохраняет временные идентификаторы?

Я не могу понять, в чем проблема...

1 ответ

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

CREATE TABLE players (
 player_id UNSIGNED INTEGER auto_increment PRIMARY KEY,
 player_name VARCHAR(255)) ENGINE = InnoDB;

CREATE TABLE goals (
 goal_id UNSIGNED INTEGER auto_increment PRIMARY KEY,
 player_id UNSIGNED INTEGER,
 FOREIGN KEY fk_player(player_id) REFERENCES players(player_id)) ENGINE = InnoDB;

Теперь, когда вы добавляете нового игрока и цель идти с ним, вы можете использовать код, например:

INSERT INTO players (player_name) VALUES ('Johan Cruijf');
SELECT LAST_INSERT_ID() INTO @player_id;
INSERT INTO goals (player_id) VALUES (@player_id);

Поскольку поле id является auto_incrementing, вы не должны указывать его при вставке. Используя встроенную функцию MySQL last_insert_id() вы можете получить последний сгенерированный идентификатор auto_increment и использовать его как вход в следующий оператор insert.

Комментарий к вашему коду Я вижу, что вы сохраняете несколько целей в одной строке. Это плохой дизайн базы данных, что произойдет, если игрок забьет 13 голов в одной игре? Вам нужно поставить goals в отдельной таблице из таблицы games и связать их с игроками и играми.

TABLE goals (
 goal_id UNSIGNED INTEGER auto_increment PRIMARY KEY,
 game_id UNSIGNED INTEGER NOT NULL,
 player_id UNSIGNED INTEGER NOT NULL,
 when DATETIME NOT NULL,
 FOREIGN KEY fk_game(game_id) REFERENCES games(game_id),
 FOREIGN KEY fk_player(player_id) REFERENCES players(player_id)

Когда вы хотите перечислить все цели в игре, вы можете сделать запрос типа:

SELECT go.when, p.name, ga.something
FROM goals go
INNER JOIN players p ON (p.player_id = go.player_id)
INNER JOIN games ga ON (ga.game_id = go.game_id)
WHERE ga.game_id = 1548

licensed under cc by-sa 3.0 with attribution.