起初,我尝试使用IF NOT EXISTS
进行SQL查询,但是我总是遇到语法错误,并不真正理解为什么。但是输入我的标题stackoverflow给我一些有关同一问题的问题。足够有趣的是,Google找不到它们……无论如何,所以我将查询更改为Mike在this Question中的建议。
现在我有以下代码片段:
$tblTeam = "INSERT INTO tblTeam (nameTeam, nationID)
SELECT * FROM (SELECT '" . $match_Team[1] . "', (SELECT nationID FROM tblNation WHERE nameNation = '" . $nation_name[1] . "')) AS tmp
WHERE NOT EXISTS (
SELECT nameTeam FROM tblTeam WHERE nameTeam = '" . $match_Team[1] . "'
) LIMIT 1;
INSERT INTO tblTeam (nameTeam, nationID)
SELECT * FROM (SELECT '" . $match_Team[2] . "', (SELECT nationID FROM tblNation WHERE nameNation = '" . $nation_name[2] . "')) AS tmp
WHERE NOT EXISTS (
SELECT nameTeam FROM tblTeam WHERE nameTeam = '" . $match_Team[2] . "'
) LIMIT 1;";
如果我直接在phpMyAdmin中使用纯SQL语法运行该查询,一切都很好,我将在tblTeam
中获得条目。但是,一旦我尝试通过PHP做到这一点,就会收到以下语法错误:
Error description tblTeam:
您的SQL语法有错误; 检查与您的MariaDB服务器版本相对应的手册以获取正确的语法 在'INSERT INTO tblTeam(nameTeam,nationalID)附近使用SELECT * FROM(在第7行选择'B'
我现在有点困惑,因为我看不出问题所在。在我的调试示例中,$match_Team[1]
的值为Serbia
,$match_Team[2]
的值为Brazil
。分别适用于$nation_name[1]
和$nation_name[2]
。
编辑:因为@FDavidov要求这样做,所以这里是$ tblTeam的内容:
在tblTeam中插入(nameTeam,nationalID)SELECT * FROM(选择'Serbia',(从tblNation WHERE nameNation ='Serbia'选择SELECT nationalID'))不存在tmp(从tblTeam WHERE nameTeam ='Serbia'中选择nameTeam LIMIT 1;将INSERT插入tblTeam(nameTeam,nationalID)SELECT * FROM(选择'Brazil',(从tblNation WHERE nameNation ='Brazil'选择SELECT nationalID'))在不存在tmp的情况下(从tblTeam WHERE nameTeam ='Brazil'的SELECT nameTeam)限制1;
答案 0 :(得分:1)
让数据库为您完成数据验证。如果要确保name
是唯一的,请添加唯一的索引/约束:
create unique index unq_tblTeam_nameTeam on tblTeam(nameTeam);
然后,当您加载数据时,可以使用on duplicate key update
忽略该错误:
insert into tblTeam (nameTeam, nationId)
select ?, n.nationId
from tblNation n
where n.nameNation = ?
on duplicate key update nameTeam = values(nameTeam);
on duplicate key
子句什么都不做-无操作。但这确实可以防止错误。
?
是参数的占位符。您应该学会用参数编写查询,而不是用这种值来修饰查询字符串,否则会导致错误和SQL注入攻击。
答案 1 :(得分:0)
因此,由于这个问题而困扰了两天后,我终于找到了解决方案-实际上有很多问题,而不仅仅是一个。
首先,$nation_name
的字符串错误,而不是实际的国家。仍然会有语法错误。
接下来,我发现mysqli_query()
不允许在同一$tblTeam
中进行两个查询。这就解释了为什么SQL代码可以在phpMyAdmin中工作,而不能在PHP中工作。但是,对于这种情况存在mysqli_multi_query()
。不过,我在解析时会遇到问题。我遵循了很多在网上找到的示例,但是它永远都行不通。我想语法错误我也总是在这里掩盖实际错误。
现在的最终解决方案是将其拆分为两个单独的查询。它需要更多的代码行,但这是最简单的方法并且可以正常工作。现在,代码片段如下所示:
$tblTeam1 = "INSERT INTO tblTeam (nameTeam, nationID)
SELECT '" . $match_Team[1] . "', (SELECT nationID FROM tblNation WHERE nameNation = '" . $nation_name[1] . "')
WHERE NOT EXISTS (
SELECT nameTeam FROM tblTeam WHERE nameTeam = '" . $match_Team[1] . "'
)";
$tblTeam2 = "INSERT INTO tblTeam (nameTeam, nationID)
SELECT '" . $match_Team[2] . "', (SELECT nationID FROM tblNation WHERE nameNation = '" . $nation_name[2] . "')
WHERE NOT EXISTS (
SELECT nameTeam FROM tblTeam WHERE nameTeam = '" . $match_Team[2] . "'
)";