解决这个问题的方法是改变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
?使用select max(player_id)并添加一个以获得可用的下一个ID – Alfabravo 2011-12-22 11:50:35
@Alfabravo,使用max(x)+1是一个非常糟糕的主意,请改为使用auto_increment字段。 – Johan 2011-12-22 12:38:32
你说得对,先生。使用auto_increment或等价物,获取用于插入查询的id值,然后在目标表中使用它。 – Alfabravo 2011-12-22 12:40:27