mysql - 选择并插入到mysql中的表中

标签 mysql

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/

相关文章:

php - Mysql 查询 - 使用像 <something> 和 <something ='1' > 限制

从数据库检索时php标签数据不执行

php - 上传pdf文件到Mysql服务器

Mysql 索引和连接

php - 如何在 POST 到数据库之前将用户消息转换为字符串?那么几乎如何使用 php pdo mysql 避免 SQL 注入(inject)等

mysql - 如何更新MySQL表中的多个列值

mysql - 通过自连接从表中获取最新记录

mysql - 来自同一个表-H2 数据库的两个联合

mysql - 如何选择剩余的未指定列

php - 我不断收到无效参数编号 : number or bound variables does not math number of tokens in yii2