我正在尝试将玩家插入数据库。如果团队中的某个球员与要插入的球员具有相同的“ Rugnummer”,则应该更改该球员正在插入的“ Rugnummer”。相反,我所知道的代码更改了表中已经存在的播放器的“ Rugnummer”。再次运行INSERT会导致将新播放器插入到已有播放器具有的“ Rugnummer”中。
我尝试了几种不同的事情,不同的代码段并更改了一些内容,但是在进行了一些更改之后,似乎什么都没发生。
我也尝试使用触发器,但是插入了OLD。Rugnummer无法使用。
INSERT INTO spelers (Speler_voornaam, Speler_achternaam, Team_ID, Rugnummer)
VALUES ("Bram", "Bakker", 1, 28)
ON DUPLICATE KEY UPDATE Rugnummer =
(select (t*10+u+1) x from (select 0 t union select 1 union select 2 union select 3 union select 4) A,
(select 0 u union select 1 union select 2 union select 3 union select 4 union
select 5 union select 6 union select 7 union select 8 union select 9) B
WHERE (t*10+u+1) NOT IN (SELECT Rugnummer
FROM spelers AS s
WHERE Team_ID = 1)
ORDER BY x
LIMIT 1
以下是我尝试过的插入内容。我期望数字1到10,字母A到J。实际上显示的是带有“ Rugnummer” 12的A-A,而没有显示J-J。 A-A更改为J-J(它们具有相同的“ Rugnummer”)
INSERT INTO spelers (Speler_voornaam, Speler_achternaam, Team_ID, Rugnummer)
VALUES
("A", "A", 19, 1),
("B", "B", 19, 2),
("C", "C", 19, 3),
("D", "D", 19, 4),
("E", "E", 19, 5),
("F", "F", 19, 6),
("G", "G", 19, 7),
("H", "H", 19, 8),
("I", "I", 19, 9),
("J", "J", 19, 1)
ON DUPLICATE KEY UPDATE Rugnummer =
(select (t*10+u+1) x from (select 0 t union select 1 union select 2 union select 3 union select 4) A,
(select 0 u union select 1 union select 2 union select 3 union select 4 union
select 5 union select 6 union select 7 union select 8 union select 9) B
WHERE (t*10+u+1) NOT IN (SELECT Rugnummer
FROM spelers AS s
WHERE Team_ID = 1)
ORDER BY x
LIMIT 1)
预期结果是,将使用尚未使用的“ Rugnummer”插入新播放器,而无需两次使用insert语句并更改已经存在的播放器的“ Rugnummer”。
答案 0 :(得分:0)
我认为使用以下功能会更好:
CREATE FUNCTION GetRugnummer (Rugnummer INT, Team INT) RETURNS INT
BEGIN
/*CODE if Rugnummer doesn't exist return Rugnummer
Otherwise search for minimum available number (see query below)*/
END $$
不管查询如何找到最小可用数字,我都会创建一个表,其中只有一列包含所有可能的数字。
然后您可以进行左联接:
SELECT MIN(r.num) FROM RugNummers r
LEFT JOIN spelers s ON r.num=s.Rugnummer AND s.Team_ID=@Team
WHERE s.Rugnummer IS NULL;
将来,这样(如果您想拥有更多的玩家编号),您只需要向表中添加行即可。
如果您决定使用该函数,则可以在INSERT语句上使用它,例如:
INSERT INTO spelers (Speler_voornaam, Speler_achternaam, Team_ID, Rugnummer)
VALUES ("A", "A", 19, GetRugnummer(1, 19))
我认为这比使用DUPLICATE KEY更好