2015-02-03 2 views
1

У меня есть 3 простых таблиц:
игроков:
CREATE TABLE IF NOT EXISTS players (id INTEGER PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), UNIQUE KEY (name));

арен:
CREATE TABLE IF NOT EXISTS arenas (id INTEGER PRIMARY KEY AUTO_INCREMENT, name VARCHAR(40), UNIQUE KEY (name));

и точек:
CREATE TABLE IF NOT EXISTS points (playerID INTEGER, arenaID INTEGER, points INTEGER, PRIMARY KEY (playerID, arenaID));

я хочу вставить новую строку до стола points и автоматически вставлять строки игрокам и аренам, если это необходимо, в настоящее время у меня только простой INSERT:
MySQL SELECT, или INSERT, если строка не существует еще

INSERT INTO points (playerID, arenaID, points) 
VALUES 
(
    (SELECT players.id FROM players WHERE players.name LIKE ?), 
    (SELECT arenas.id FROM arenas WHERE arenas.name LIKE ?), 
    ? 
) ON DUPLICATE KEY UPDATE points.points = LEAST(points.points, VALUES(points.points)); 

? будет заменен на значение.
Горячий, чтобы отредактировать этот SQL, поэтому, если нет игрока (SELECT players.id FROM players WHERE players.name LIKE ?), тогда он будет INSERT нового игрока в эту таблицу, это же с аренами.
как: (мой псевдокод)

INSERT INTO points (playerID, arenaID, points) 
VALUES 
(
    (SELECT players.id FROM players WHERE players.name LIKE "Mary" ON KEY NOT EXIST INSERT INTO players (name) VALUES ("Mary")), 
    (SELECT arenas.id FROM arenas WHERE arenas.name LIKE "BigBoy" ON KEY NOT EXIST INSERT INTO arenas (name) VALUES ("BigBoy")), 
    200 
) ON DUPLICATE KEY UPDATE points.points = LEAST(points.points, VALUES(points.points)); 

И еще вставить, что новый points ряд.

+0

Для этого вам необходимо использовать триггеры - триггер вставки в 'points'. –

+0

Или хранимые процедуры. – jarlh

ответ

1

Почему не сделать это в три этапа, вы можете использовать хранимую процедуру

IF NOT EXISTS arenas (id INTEGER PRIMARY KEY AUTO_INCREMENT, name VARCHAR(40), UNIQUE KEY (name)) 
begin 
    INSERT INTO arenas (name) VALUES ("BigBoy") 
end 
IF NOT EXISTS players (id INTEGER PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), UNIQUE KEY (name)) 
begin 
    INSERT INTO players (name) VALUES ("Mary") 
end 

INSERT INTO points (playerID, arenaID, points) 
VALUES 
(
    (SELECT players.id FROM players WHERE players.name LIKE "Mary"), 
    (SELECT arenas.id FROM arenas WHERE arenas.name LIKE "BigBoy"), 
    200 
) ON DUPLICATE KEY UPDATE points.points = LEAST(points.points, VALUES(points.points)); 
+0

является 'IF NOT EXISTS' отличается от простого' INSERT IGNORE INTO' здесь? – GotoFinal

1

Вы можете использовать INSERT IGNORE заявление.

INSERT IGNORE INTO players (name) VALUES (?); 

INSERT IGNORE INTO arenas (name) VALUES (?); 

INSERT INTO points (playerID, arenaID, points) 
VALUES 
(
    (SELECT players.id FROM players WHERE players.name LIKE ?), 
    (SELECT arenas.id FROM arenas WHERE arenas.name LIKE ?), 
    ? 
) ON DUPLICATE KEY UPDATE points.points = LEAST(points.points, VALUES(points.points)); 
Смежные вопросы