【问题标题】:Select and insert into a table in mysql选择并插入到mysql中的表中
【发布时间】:2013-08-07 06:26:33
【问题描述】:

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

【问题讨论】:

标签: mysql


【解决方案1】:

一种可能的方法

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)

结果:

|身份证 |用户名 | ----------------- | 1 | 001 | | 2 | 002 |

这里是SQLFiddle演示

【讨论】:

  • @George 不客气。我很高兴能帮上忙 :) 查看更新的答案以了解另一种更精确的方法。
  • 谢谢peterm,我很感激。它们既精确又漂亮。谢谢。但是请在我让你走之前,是否可以在一张桌子上创建两个触发器?谢谢
  • @George 每个事件和操作只能触发一个。这意味着您只能使用一个 BEFORE INSERT 和一个 AFTER INSERT 触发器等。但您始终可以容纳触发器的逻辑以支持所有可能的(MySql 允许的)处理。
  • @peterm.Thanks for time
  • @peterm.请看这个问题,如果你能帮忙[link](stackoverflow.com/q/18091831/2595059).Thanks
【解决方案2】:

为什么要存储值?

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

【讨论】:

    猜你喜欢
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2017-12-09
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多