1

我想使用 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 字符串?

4

3 回答 3

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

于 2013-10-28T15:33:18.687 回答
0

在插入之前不可能知道 ID 是什么。也不建议将此数据用作实际值。该列应该是行的透明标识符。这对 s 很有用JOIN。它可以方便查找的事实是偶然的,不应依赖。

应将此 ID 视为随时可能更改。如果您需要其他标识符(例如序号),则应将其存储在单独的字段中并由应用程序处理。

想象一下,如果这个脚本正在被高速访问。其中许多INSERT查询可能同时运行(甚至在不同的服务器上),因此在查询完成之前无法知道 ID。即使在查询完成后,复制同步后 ID 也可能会更改,并且image列的数据可能会不一致。

于 2013-10-28T15:26:07.913 回答
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');

结果:

| 身份证 | 介绍 | 详情 | 图片 |
|----|--------------|----|--------|
| 1 | 介绍文字 1 | 详细文字 1 | 1.jpg |
| 2 | 介绍文字 2 | 详细文字 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演示

于 2013-10-28T15:31:41.667 回答