4

可能重复:
在 INSERT INTO 语句期间访问自动增量值

我想在创建要存储在数据库中的页面时为我的 URL 生成 slug。蛞蝓应该是title-id(例如titlename-234)。我已经有了剥离标题的功能,但是如何在插入记录之前获取 id?

提前谢谢了

4

1 回答 1

5

您应该创建一个触发器,如下所示:

CREATE TRIGGER trigger_name BEFORE INSERT ON table
FOR EACH ROW SET slug = CONCAT(NEW.title, "-", NEW.id);

我不确定您是否能够在将 ID 列写入数据库之前访问它(当然,除非您自己生成 ID,而不是使用自动增量)。

如果您使用数据库的自动增量(并且应该使用),请尝试在插入后创建触发器,并更新触发器中的行。这样,即使您在插入后更新它,它仍然会在您运行任何其他查询(如 SELECT)之前运行。

这里是关于触发器的文档。


我错了。显然,您无法更新要插入的表(使用 AFTER INSERT 触发器),它会引发异常。因此,单独使用 SQL 有两种可能的方法:

丑陋的方式:

DELIMITER $$
CREATE TRIGGER `create_slug` BEFORE INSERT
    ON `events`
    FOR EACH ROW
BEGIN
    SET new.id = (SELECT MAX(id) FROM events) + 1;
    SET new.slug = CONCAT(new.menu_name, "-", new.id);
END$$
DELIMITER ;

它会覆盖数据库的 AUTOINCREMENT。真的,不要那样做。

或者,您可以创建一个过程:

DELIMITER $$

CREATE PROCEDURE insert_event(MenuName VARCHAR(30), Content TEXT, PhotoName TEXT)
BEGIN
    INSERT INTO events (menu_name, content, photo_name) VALUES (MenuName, Content, PhotoName);
    SET @id = LAST_INSERT_ID();
    UPDATE events SET slug = CONCAT(menu_name, "-", @id) WHERE id = @id;
END$$

DELIMITER ;

而且,而不是打电话(正如你打电话):

$query = mysql_query("INSERT INTO events (menu_name, content, photo_name) VALUES ('{$menu_name}', '{$content}', '{$photo_name}');", $connection); 

打电话

$result = mysql_query("CALL insert_event('{$menu_name}', '{$content}', '{$photo_name}');",$connection );

同样,我强烈建议不要使用 mysql_query。它已经过时、停产且不安全。您应该检查 mysqli 或 PDO。

于 2012-11-08T17:34:16.610 回答