我想使用id来命名行内的图像文件。有没有办法在查询本身内使用(当前)行的id。 (我知道lastInsertId(),但它通常在查询之后而不在其中。)
INSERT INTO table (id, intro, detail, image)
VALUES (null, introtext, detailtext, get_the_id_of_this_query_itself.jpg )
我知道我可以保存此图片的扩展名(如.jpg),然后将其与文章的ID一起使用。但我想知道这是否可能。
之后补充说: 我们是否可以在插入查询中使用子查询,将max(id)增加1,然后为图像名称添加.jpg字符串?
答案 0 :(得分:1)
INSERT INTO table (id, intro, detail, image)
SELECT id, 'introtext', 'detailtext', CONCAT('id_', id, '.jpg')
FROM ( SELECT AUTO_INCREMENT AS id
FROM `information_schema`.`TABLES`
WHERE `TABLE_SCHEMA` LIKE 'database_name' AND `TABLE_NAME` LIKE 'table') AS h
相应地替换table
和database_name
。
答案 1 :(得分:0)
在插入之前无法知道ID是什么。也不建议将此数据用作实际值。此列应该是行的透明标识符。这对JOIN
很有用。它可以方便查找这一事实是偶然的,不应该依赖它。
此ID应视为可随时更改。如果您需要其他标识符(例如序号),则应将其存储在单独的字段中并由应用程序处理。
想象一下,如果高速访问此脚本。其中许多INSERT
查询可能同时运行(甚至在不同的服务器上),因此在查询完成之前无法识别ID。即使在查询完成后,也可能在复制同步后更改ID,并且image
列的数据可能不一致。
答案 2 :(得分:0)
即使从技术上讲,您可以在MySQL中使用单独的排序表和BEFORE
触发器来实现此目的
表模式:
CREATE TABLE articles_seq
(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
);
CREATE TABLE articles
(
`id` INT NOT NULL PRIMARY KEY DEFAULT 0,
`intro` VARCHAR(128),
`detail` VARCHAR(128),
`image` VARCHAR(128)
);
触发器:
DELIMITER $$
CREATE TRIGGER tg_bi_articles
BEFORE INSERT ON articles
FOR EACH ROW
BEGIN
INSERT INTO articles_seq () VALUES ();
SET NEW.id = LAST_INSERT_ID(),
NEW.image = CONCAT(NEW.id, '.jpg');
END$$
DELIMITER ;
现在您可以插入这样的记录
INSERT INTO articles (`intro`, `detail`, `image`) VALUES
('Intro text 1', 'Details text 1', '.jpg'),
('Intro text 2', 'Details text 2', '.png');
结果:
| ID | INTRO | DETAIL | IMAGE | |----|--------------|----------------|-------| | 1 | Intro text 1 | Details text 1 | 1.jpg | | 2 | Intro text 2 | Details text 2 | 2.jpg |
这是 SQLFiddle 演示
没有它你最好。您可以使用视图
CREATE TABLE articles
(
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`intro` VARCHAR(128),
`detail` VARCHAR(128),
`ext` VARCHAR(32)
);
CREATE VIEW vw_articles AS
SELECT id, intro, detail, CONCAT(id, '.', ext) image
FROM articles;
这是 SQLFiddle 演示