这不是重复的问题,因为我问如何在一个PHP变量中使用SET和INSERT,对AUTO_INCREMENT没有任何疑问......
我的页面如下:
<?php
function genWO(){
$dbtype = "MySQL";
$username = "user";
$password = "pass";
$hostname = "10.10.10.10";
$dbname = "TABLES";
//connection to the database
$conn = new mysqli($hostname, $username, $password);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$insertNewWONum = "SET @MAX_WO = (SELECT max(WO_NUM) + 1 from GENERIC_TABLES.WO_NUMBERS); INSERT INTO GENERIC_TABLES.WO_NUMBERS (WO_NUM, WO_REQUESTOR) values (@MAX_WO, `test`)";
if ($conn->query($insertNewWONum) === TRUE) {
echo "New record created successfully". "<br>";
} else {
echo "Error: " . $insertNewWONum . "<br>" . $conn->error;
}
$getWONum = "SELECT LPAD(max(WO_NUM) ,6,0) as NEW_WO_NUM from GENERIC_TABLES.WO_NUMBERS";
$result = $conn->query($getWONum);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo "New WO Number: " . $row["NEW_WO_NUM"]. "<br>";
}
} else {
echo "0 results";
}
//close the connection
$conn->close();
}
?>
由于不允许在一个查询中对同一个表使用INSERT和SELECT,我试图设置变量并在INSERT查询中使用它:
$insertNewWONum = "SET @MAX_WO = (SELECT max(WO_NUM) + 1 from GENERIC_TABLES.WO_NUMBERS); INSERT INTO GENERIC_TABLES.WO_NUMBERS (WO_NUM, WO_REQUESTOR) values (@MAX_WO, `test`)";
但它不起作用,但如果我在终端中使用此查询,它可以正常工作。
任何人都可以告诉我如何实现它吗?
答案 0 :(得分:0)
由于不允许在一个查询中对同一个表使用INSERT和SELECT
除了您的方法的所有问题当然您可以在一个声明中使用INSERT
和SELECT
INSERT INTO WO_NUMBERS (WO_NUM, WO_REQUESTOR)
SELECT COALESCE(MAX(WO_NUM), 0) + 1, 'Test'
FROM WO_NUMBERS;
以下是SQLFiddle演示。
现在您需要意识到的是,您的方法对于并发访问不安全。如果此代码同时从两个或多个会话执行,则它们中的一些或全部可能生成相同的数字,从而有效地破坏您的应用程序。
请改用AUTO_INCREMENT
。
CREATE TABLE WO_NUMBERS
(
WO_NUM INT PRIMARY KEY AUTO_INCREMENT,
WO_REQUESTOR VARCHAR(32)
);
INSERT INTO WO_NUMBERS (WO_REQUESTOR) VALUES ('Test');
以下是SQLFiddle演示。
如果出于某种原因,您无法直接使用AUTO_INCREMENT
(我老实说也不明白您为什么不能这样做),即您需要添加前缀或增加生成的ID /您可以通过某种方式查看代码this answer。