我想在执行INSERT时获取新条目的auto_incr值,并动态创建表字段'url'。
示例:
数据库表字段:
id,category,sex,age,url(我想在末尾插入一个带auto_incr的url)
变量:
$ category = employee;
$性别=男性;
$ age = 30;
INSERT INTO表VALUES(NULL,$ category,$ sex,$ age,'mywebsite.com / employee-male-30-00000001')
注意:假设新插入的ID为00000001
我目前正在插入带有空白网址的新条目,然后获取mysql_insert_id(),然后使用网址更新新条目。
只有一次数据库交互有没有更好的方法来实现这一目标?
答案 0 :(得分:1)
您可以使用一个事务执行此操作,但不能使用一个 SQL语句执行此操作。
原因是您无法获取生成的ID,直到修改其他列中的值为时已晚。例如,如果您尝试使用触发器执行此操作,则无法在BEFORE触发器中获取自动增量值,因为它尚未生成。但是,您无法在AFTER触发器中修改url
等列的值。
唯一的解决方案是执行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
和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();
答案 1 :(得分:0)
不要那样在URL字段中存储。只需存储URL。在您选择时,您可以选择url和id列,并在应用程序层中构建已连接的URL,用户使用SQL,如
select concat(url,'-',id) from mytable;