【问题标题】:mysql is it possible to do insert into insert?mysql是否可以插入插入?
【发布时间】:2012-03-13 10:50:16
【问题描述】:

我正在做的是将旧数据库克隆到具有不同结构但应该具有相同旧数据的新数据库

是否可以在 insert 中执行 insert 以返回插入查询的 id

INSERT INTO tab1 (nom,id_2) VALUES
("jack",(INSERT INTO tab2 (pass) VALUES ("1234")));

INSERT INTO tab2 (pass) VALUES ("1234")我想得到插入的id

但没有运气!! (我希望它在一个 sql 查询中(我已经知道 mysql_insert_id))

提前致谢

【问题讨论】:

  • 为什么没有两个单独的语句?第一个将插入到 tab2 中,第二个将使用相同的值并插入到 tab1 中。
  • 如何在tab2 上插入行,然后使用last_insert_id()dev.mysql.com/doc/refman/5.0/en/…
  • quote:“子查询是另一个语句中的 SELECT 语句。” mysql 站点将解释如何使用子查询。
  • 子查询只是嵌套查询的 mysql 术语。我的意思是你不能在另一个语句中插入,你只能在另一个查询中嵌套一个选择。所以不管php,在mysql中没有合法的方法。

标签: php mysql insert


【解决方案1】:

您不能在单个查询中执行此操作 - 例如,使用 mysql_insert_id() 获取最后插入的 id:

mysql_query('INSERT INTO tab2 (pass) VALUES ("1234")');
$lastid =  mysql_insert_id();
mysql_query('INSERT INTO tab1 (nom,id_2) VALUES ("jack",'.$lastid.')');

【讨论】:

  • 我只希望它在一个 sql 查询中(我已经知道 mysql_insert_id)
  • @mgraph 我害怕你不能!
【解决方案2】:

insert id 也可以在 mysql 中检索,所以这里是一个不涉及 PHP 的版本(但它执行 2 个查询)

INSERT INTO tab2 (pass) VALUES ("1234");
INSERT INTO tab1 (nom,id_2) VALUES("jack",LAST_INSERT_ID());

【讨论】:

  • @mgraph - 你被告知你不能......为什么你在一个查询中需要它?
  • @mgraph 使用多插入,它将生成顺序 ID。然后获取第一个,并在循环中递增它
【解决方案3】:

锁定表,插入,选择 max(id),解锁表。如果您出于某种原因对最后一个插入 id 函数不利,这是在创建自己的序列表(如在 postgres 中)之外的唯一方法。但是,如果您的表是中等到高写入量,这种方法就像将焦油倒入搅拌机中一样。

【讨论】:

  • max(id) 如果您有多个并发数据库访问,则不太好...不要滥用您的数据库,使用 mysql_insert_id();
  • @MarkBaker 如果多个连接尝试访问该表,它确实会创建一个 logjam,但如果在锁定的表中,它会可靠地报告您插入的最后一个 ID。
【解决方案4】:

您不能将其作为单个插入来执行,因为插入是原子的,也就是说,在语句完成之前不会确定 ID。

将两个语句包装在一个事务中,您将获得您的 ID 和原子性。

【讨论】:

    猜你喜欢
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 2012-02-11
    • 2012-01-20
    • 1970-01-01
    • 2018-02-25
    • 2013-06-10
    相关资源
    最近更新 更多