我试着通过一个简单的例子来解释我的情况。我有两张表players
和goals
。在目标中,我为每位玩家存储了一年的目标号码,我以这种方式加入:
SELECT goals_02, goals_03, goals_04 ecc FROM goals WHERE goals_id = '$player_id';
所以goal_id和player_id是且必须相同。到目前为止没问题。由于我的PHP代码存在一些问题,我做了一些实验,在查询和其他查询之间,ids继续创建这种情况:
球员表
player_id | player_name
1 | Aaron Mokoena
2 | Abdel El-Saqua
3 | Abdullah Zubromawi
4 | experiment1
5 | test
一旦解决了问题我再次开始添加玩家但不知道如何从我离开的地方重新开始编号ID,我手动编辑了phpmyadmin的新ID ...所以,我添加了Abdulrahim Jumaa并改变了他的身份6(由mysql自动分配)到4,我对目标表做了同样的事情。
我的问题是,现在MySQL没有关联id,似乎player_id和goal_id彼此不同......也许有一种缓存,其中mysql保存临时id?
我无法弄清楚问题是什么......
答案 0 :(得分:0)
解决此问题的方法是将id更改为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 id,并将其用作下一个insert语句的输入。
评论您的代码
我看到你在一行中存储了多个目标。这是糟糕的数据库设计,what happens if a player scores 13 goals in one game?
您需要将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