选择并插入mysql中的表

时间:2013-08-06 21:25:32

标签: 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和username中都给出了null值。 预期结果如下。

id        username
001         001
002         002
003         003

2 个答案:

答案 0 :(得分:1)

可能的方法

INSERT INTO table1 (username)
SELECT LPAD(COALESCE(MAX(id), 0) + 1, 3, '0')
  FROM table1

这是 SQLFiddle 演示

这种方法的一个缺点是,在负载较重的情况下,不同的并发用户可能会获得相同的MAX(id),并且您最终会得到具有不同ID但具有相同用户名的行。


现在,更精确的方法是使用单独的排序表和BEFORE INSERT triger

建议更改的表格架构

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 演示

答案 1 :(得分:1)

为什么要存储该值?

CREATE TABLE table1 (
   id int(3) zerofill auto_increment PRIMARY KEY
);

CREATE VIEW oh_look_username
  AS
SELECT id
     , LPad(Cast(id As varchar(10)), 3, '0') As username
FROM   table1