您可以用一个事务来完成,但不能用一个SQL 语句来完成。
原因是您无法获取生成的 id,直到修改其他列中的值来不及。例如,如果您尝试使用触发器执行此操作,则无法在 BEFORE 触发器中获取自动增量值,因为它尚未生成。但是您不能像url
在 AFTER 触发器中那样修改列的值。
唯一的解决方案是执行 INSERT,然后立即使用 UPDATE 来修改您的url
. 在事务中执行此操作以确保没有其他线程可以看到部分完成的行。
mysql_query("START TRANSACTION");
mysql_query("INSERT INTO `table`
VALUES(NULL,$category,$sex,$age,'mywebsite.com/employee-male-30-')");
mysql_query("UPDATE `table` SET url = CONCAT(url, LPAD(id, 8, '0'))
WHERE id = LAST_INSERT_ID()");
mysql_query("COMMIT");
如果您使用旧的 ext/mysql 接口,则必须将START TRANSACTION
andCOMMIT
作为查询字符串执行,因为该接口没有任何直接函数。
但最好切换到 PDO,因为ext/mysql 已被弃用,并将在未来的 PHP 版本中删除。这将允许您停止将 PHP 变量放入 SQL 字符串中。
$pdo = new PDO(...);
$pdo->beginTransaction();
$stmt = $pdo->prepare("
INSERT INTO `table`
SET category = ?, sex = ?, age = ?, url = ?");
$stmt->execute([$category, $sex, $age, "mywebsite.com/employee-male-30-"]);
$pdo->exec("
UPDATE `table`
SET url = CONCAT(url, LPAD(id, 8, '0'))
WHERE id = LAST_INSERT_ID()");
$pdo->commit();