0

我想在执行 INSERT 时获取新条目的 auto_incr 值,并即时创建表字段“url”。

例子:

数据库表字段:
id、category、sex、age、url(我想在末尾插入一个带有 auto_incr 的 url)

变量:
$category = 员工;
$性别=男性;
$年龄=30;

插入表值(NULL,$category,$sex,$age,'mywebsite.com/employee-male-30-00000001')

注意:假设新插入的id是00000001

我目前正在使用空白 url 插入新条目,然后获取 mysql_insert_id(),然后使用 url 更新新条目。

有没有更好的方法通过一个数据库交互来完成这个?

4

2 回答 2

1

您可以用一个事务来完成,但不能用一个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 TRANSACTIONandCOMMIT作为查询字符串执行,因为该接口没有任何直接函数。

但最好切换到 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();
于 2014-11-13T00:10:30.133 回答
0

不要像那样麻烦存储在 URL 字段中。只需存储 URL。当您选择退出时,您可以选择 url 和 id 列并在应用程序层中构建连接的 url 用户使用 SQL 之类的

select concat(url,'-',id) from mytable;
于 2014-11-13T00:21:45.837 回答