可能重复:
INSERT INTO语句期间访问自动增量值
我想在创建要存储在数据库中的页面时为我的URL生成slug.slu ::应该是title-id(例如titlename-234).我已经有了剥离标题的功能但是如何在插入记录之前获取id?
提前谢谢了
您应该创建一个触发器,类似于:
CREATE TRIGGER trigger_name BEFORE INSERT ON table
FOR EACH ROW SET slug = CONCAT(NEW.title, "-", NEW.id);
Run Code Online (Sandbox Code Playgroud)
我不确定在写入数据库之前您是否能够访问ID列(当然,除非您自己生成ID,而不是使用自动增量).
如果您正在使用数据库的自动增量(并且您应该使用),请尝试在插入后创建触发器,并更新触发器中的行.这样,即使您在插入后更新它,它仍然会在您运行任何其他查询(如SELECT)之前运行.
HERE是关于触发器的文档.
我错了.显然,您无法更新要插入的表(使用AFTER INSERT triger),它会抛出异常.因此,有两种方法可以单独使用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 ;
Run Code Online (Sandbox Code Playgroud)
它会覆盖数据库的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 ;
Run Code Online (Sandbox Code Playgroud)
并且,而不是呼叫(因为你在呼叫):
$query = mysql_query("INSERT INTO events (menu_name, content, photo_name) VALUES ('{$menu_name}', '{$content}', '{$photo_name}');", $connection);
Run Code Online (Sandbox Code Playgroud)
只是打电话
$result = mysql_query("CALL insert_event('{$menu_name}', '{$content}', '{$photo_name}');",$connection );
Run Code Online (Sandbox Code Playgroud)
同样,我强烈建议不要使用mysql_query.它已经过时,停产和不安全.你应该看看mysqli或PDO.
| 归档时间: |
|
| 查看次数: |
1706 次 |
| 最近记录: |