Вы можете сделать это с одной сделки, но вы не можете сделать это с одним SQL заявление.
Причина в том, что вы не можете получить генерируемый идентификатор, пока не будет слишком поздно изменять значения в других столбцах. Например, если вы попытаетесь сделать это с помощью триггеров, вы не сможете получить значение автоинкремента в триггере 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");
Если вы используете старый интерфейс внутр/MySQL, вы должны выполнить START TRANSACTION
и COMMIT
как строки запроса, потому что интерфейс не имеет каких-либо прямых функций для них.
Но вам было бы лучше перейти на PDO, потому что ext/mysql is deprecated и будет удален в будущей версии 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();