Mysql表
create table table1(
id int(3) zerofill auto_increment primary key,
username varchar(10)
)
engine=innodb;
Mysql插入查询
insert into table1 (username)
select id from (select id from table1) as a where
a.id=last_insert_id();
我试图通过从同一个表和同一行中选择最后一个 id 来插入表,上面的查询解释了我想要做什么。插入查询在 id 和用户名中给出了 null 值。 预期结果如下。
id username
001 001
002 002
003 003
最佳答案
一种可能的方法
INSERT INTO table1 (username)
SELECT LPAD(COALESCE(MAX(id), 0) + 1, 3, '0')
FROM table1
这里是SQLFiddle 演示
这种方法的一个缺点是,在重负载下,不同的并发用户可能会获得相同的 MAX(id)
,并且最终会得到具有不同 id 但具有相同用户名的行。
现在,更精确的方法涉及一个单独的排序表和一个 BEFORE INSERT
触发器
建议更改的表架构
CREATE TABLE table1_seq
(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
);
CREATE TABLE table1
(
id INT(3) ZEROFILL PRIMARY KEY DEFAULT 0,
username VARCHAR(10)
);
触发器
DELIMITER $$
CREATE TRIGGER tg_table1_before_insert
BEFORE INSERT ON table1
FOR EACH ROW
BEGIN
INSERT INTO table1_seq VALUES(NULL);
SET NEW.id = LAST_INSERT_ID(), NEW.username = LPAD(NEW.id, 3, '0');
END$$
DELIMITER ;
现在您只需将新行插入到 table1
中,如下所示
INSERT INTO table1 (username)
VALUES (NULL), (NULL)
结果:
| ID | USERNAME | ----------------- | 1 | 001 | | 2 | 002 |
这里是SQLFiddle 演示
关于mysql - 选择并插入到mysql中的表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18090786/