2011-12-22 81 views
0

我试图通过一个简单的例子来解释我的情况。我有两个表playersgoals。在目标我店目标数量每年为每个球员,我以这种方式加入:MySQL和ID手动编辑

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

所以goals_id和player_id都必须相同。到目前为止没有问题。由于一些问题,我的PHP代码,我做了一些实验和查询和其他之间,IDS也水涨船高上创建这样的情况:

玩家表

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

一旦解决了我重新开始的问题添加球员但不知道如何从我停止的地方再次开始编号,我手动编辑了phpmyadmin的新ID ...所以,我添加了Abdulrahim Jumaa并将他的ID从6(由mysql自动分配)更改为4并且我对目标表做了同样的事情。

我的问题是,现在MySQL不会的ID相关联,似乎player_id和goal_id是彼此不同的。也许有一种高速缓存的MySQL在哪儿保存临时编号吗?

我想不通的问题是什么?

+0

?使用select max(player_id)并添加一个以获得可用的下一个ID – Alfabravo 2011-12-22 11:50:35

+0

@Alfabravo,使用max(x)+1是一个非常糟糕的主意,请改为使用auto_increment字段。 – Johan 2011-12-22 12:38:32

+0

你说得对,先生。使用auto_increment或等价物,获取用于插入查询的id值,然后在目标表中使用它。 – Alfabravo 2011-12-22 12:40:27

回答

0

解决这个问题的方法是改变ID被auto_incrementing和球员和目标联系起来。

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插入时,你必须指定它:现在

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; 

当您添加一个新的球员,并用它去一个目标,你可以使用如下代码。
使用内置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