0

Я хотел бы получить значение auto_incr новой записи при выполнении INSERT и создать поле «url» в поле «на лету».MYSQL get auto increment/mysql_insert_id() в INSERT

Пример:

таблицы базы данных полей:
идентификатор категории, пола, возраста, гиперссылка (я хочу, чтобы вставить URL с auto_incr в конце)

переменные:
$ category = employee;
$ sex = мужчина;
$ age = 30;

INSERT INTO таблицы VALUES (NULL, $ категории, $ пол, возраст, $ 'mywebsite.com/сотрудник-мужчина-30-00000001')

Примечание: при условии, недавно вставленный идентификатор 00000001

В настоящее время я вставляю новую запись с пустым URL-адресом, а затем получаю mysql_insert_id(), а затем обновляю новую запись с помощью URL-адреса.

Есть ли лучший способ достичь этого только одним взаимодействием с базой данных?

ответ

1

Вы можете сделать это с одной сделки, но вы не можете сделать это с одним 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(); 
0

Не беспокойтесь, сохраняя в поле URL, как это. Просто сохраните URL. Когда вы выбираете, вы можете выбрать столбцы url и id и построить конкатенированный URL-адрес на уровне приложения. Используйте SQL как

select concat(url,'-',id) from mytable;