有没有办法在查询本身内使用当前行(即将要插入)的id号?

时间:2013-10-28 15:03:04

标签: mysql sql

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

3 个答案:

答案 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

相应地替换tabledatabase_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 演示