插入语句时,有一字段的值和主键(自增)一样,怎么做到?

骄傲青蛙 2010-08-22 11:15:21
for example :

A(id, name, mark)
-- 表A,主分键是id, 自增的
-- 现在要插入一条语句,里面的mark值要和id一样,怎么做到?

insert A(name,mark)values('job',id); -- 我试了下,这样不行
...全文
2266 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2010-08-23
  • 打赏
  • 举报
回复
可以近似地用下面语句
insert A(name,mark)values('job',last_insert_id()+1);

但:
1) 并发问题
2) insert ... values (1,2),(2,3),(3,4)... 这种一个语句插入多条记录时问题

均无法处理。
ACMAIN_CHM 2010-08-23
  • 打赏
  • 举报
回复
[Quote]2. 为什么insert(name,mark)values('job', name); 这样写mark字段有值,而把后面的name换成id却没有,
数据库在插入时不是生成自增主键的吗? 为什么不能调用?


我想第二个问,应该是当values()传值时,自增主键还没生成,所以为空,当执行values()发现为空才自动生成[/Quote]
AUTO_INCREMENT 是提交后再生成的。
zuoxingyu 2010-08-23
  • 打赏
  • 举报
回复

insert into a values(0,0,'3'),(0,0,'4');


用触发器可解决一次插入多条的问题。
ACMAIN_CHM 2010-08-23
  • 打赏
  • 举报
回复
1. 实现last_insert_id函数时,基于在一个连接内多个插入的last id,还是整个数据库的 ?
整个,其实你自己做个试验就知道了。另外帮助手册中也有详细说明。

MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
zuoxingyu 2010-08-23
  • 打赏
  • 举报
回复

CREATE TABLE `a` (
`aa` int(11) NOT NULL AUTO_INCREMENT,
`bb` int(11) NOT NULL,
`cc` varchar(20) DEFAULT NULL,
PRIMARY KEY (`aa`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



drop trigger if exists trig1;
CREATE DEFINER=`cpc`@`localhost` TRIGGER `test`.`trig1` BEFORE INSERT ON test.a FOR EACH ROW
BEGIN
set new.bb=(select if(isnull(aa),1,aa+1) from (select max(aa) as aa from a) tmp);
END;



insert into a (
aa
,bb
,cc
) VALUES (
0 -- aa
,0 -- bb
,'1' -- cc
)
select * from a;
骄傲青蛙 2010-08-23
  • 打赏
  • 举报
回复
我也考虑过用last_insert_id的并发问题,关于在这里有两点不清楚,请教一下大家。


1. 实现last_insert_id函数时,基于在一个连接内多个插入的last id,还是整个数据库的 ?

2. 为什么insert(name,mark)values('job', name); 这样写mark字段有值,而把后面的name换成id却没有,
数据库在插入时不是生成自增主键的吗? 为什么不能调用?


我想第二个问,应该是当values()传值时,自增主键还没生成,所以为空,当执行values()发现为空才自动生成
feixianxxx 2010-08-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 acmain_chm 的回复:]
可以近似地用下面语句
insert A(name,mark)values('job',last_insert_id()+1);

但:
1) 并发问题
2) insert ... values (1,2),(2,3),(3,4)... 这种一个语句插入多条记录时问题

均无法处理。
[/Quote]

同意
insert A(name,mark)values('job',last_insert_id()+1);
这个方法只能一条一条插入 LZ需要注意了~
rucypli 2010-08-22
  • 打赏
  • 举报
回复
insert A(name)values('job');
update A set mard=id where id =last_insert_id();

56,938

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧