我有一个自动递增的标识列(id)。
id|name|image_path
我想知道是否有某种方法使用mysql,在image_path中使用新插入的id。 例如,如果插入新行并获得id 2,我希望image_path为“/images/2.png”。 或者我是否必须使用传统方式,通过插入然后获取此ID然后更新条目?
答案 0 :(得分:1)
我的观点是,用一个查询是不可能的。在插入行之前,您不会知道新的自动增量值。你仍然可以编写1个查询来实现你想要的东西(实际上会执行2个查询):
insert into `t`(`id`, `name`, `image_path`)
values(
(SELECT `auto_increment` FROM INFORMATION_SCHEMA.TABLES
WHERE `table_name` = 't'),
'1234',
concat(
'/images/',
(SELECT `auto_increment` FROM INFORMATION_SCHEMA.TABLES
WHERE `table_name` = 't'),
'.png'
)
)
无论如何更安全的是:
START TRANSACTION;
set @c = (select ifnull(max(`id`),0) + 1 from `t`);
insert into `t`(`id`, `name`, `image_path`) values (@c,'123',concat('/images/',@c,'.png'));
COMMIT;
答案 1 :(得分:-1)
是的,有可能用oracle。我们有动态的sql功能。
试过以下。
创建一个序列,然后创建一个以id作为输入的过程,并动态创建一个insert语句,以满足您的要求。
create sequence seq1 start with 1;
create table image1(id1 number,image varchar2(50));
create or replace procedure image1_insert(id1 in number)
as
sql_stmt varchar2(50);
image_path varchar2(50);
begin
sql_stmt:='insert into image1 values(:1,:2)';
image_path:='/image/'||id1||'.png';
execute immediate sql_stmt using id1,image_path;
end;
begin
image1_insert(seq1.nextval);
end;
id image
4 /image/4.png
5 /image/5.png
select *from image1;