我正在尝试将播放器插入数据库。如果团队中的某个球员与要插入的球员具有相同的“ 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 = 19)
ORDER BY x
LIMIT 1)


预期结果是,将使用尚未使用的“ Rugnummer”插入新播放器,而不是需要两次使用insert语句并更改现有播放器的“ Rugnummer”。

最佳答案

我认为使用以下功能会更好:

    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更好

关于mysql - 编辑了错误的播放器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56355740/

10-14 00:31