MySQL INSERT INTO查询列值等于另一个SQL SELECT查询

时间:2017-01-20 01:17:11

标签: mysql sql

有人可以指导我正确指导以下查询吗?它不能在phpMyAdmin下工作。

INSERT INTO `Setting` 
(`id`, `type`, `name`, `value`, `parentId`, `createdAt`, `updatedAt`, `createdById`, `updatedById`) 
VALUES 
(NULL, 0, 'howItWorks', 'Some URL', NULL, NULL, NULL, -1, NULL), 
(NULL, 0, 'howItWorksThumb', 'Some URL', (SELECT id FROM Setting WHERE name = 'howItWorks'), NULL, NULL, -1, NULL);

同样的查询在PostgreSQL下工作。

我收到的错误:#1093 - 您无法在FROM子句中为更新指定目标表'Setting'

问题是与LAST_INSERT_ID()解决方案相关的已解释问题的更新:

使用LAST_INSERT_ID()解决方案;子行应该在父行之后立即插入。

我想在插入父行后不立即获取子行的parentId。解决方案是什么?

如果我想为同一父行添加两个孩子呢?

3 个答案:

答案 0 :(得分:1)

MySQL不允许您在同一个表中的子查询中SELECT进入主查询中。因此,您需要将其拆分为两个INSERT个查询:

您可以使用LAST_INSERT_ID()获取在上一个INSERT中分配的自动增量ID,而不是使用子查询。

INSERT INTO `Setting` (`id`, `type`, `name`, `value`, `parentId`, `createdAt`, `updatedAt`, `createdById`, `updatedById`) 
    VALUES (NULL, 0, 'howItWorks', 'Some URL', NULL, NULL, NULL, -1, NULL);
INSERT INTO `Setting` (`id`, `type`, `name`, `value`, `parentId`, `createdAt`, `updatedAt`, `createdById`, `updatedById`) 
    VALUES (NULL, 0, 'howItWorksThumb', 'Some URL', LAST_INSERT_ID(), NULL, NULL, -1, NULL);

不幸的是,使用LAST_INSERT_ID()仍然不允许您将它们组合到单个查询中,因为它在执行任何插入之前调用该函数。

如果您稍后再进行第二次插入,则可以使用正常的INSERT ... SELECT ...执行此操作:

INSERT INTO `Setting` (`id`, `type`, `name`, `value`, `parentId`, `createdAt`, `updatedAt`, `createdById`, `updatedById`) 
SELECT NULL, 0, 'howItWorksThumb', 'Some URL', id, NULL, NULL, -1, NULL
FROM Setting
WHERE name = 'howItWorks'

答案 1 :(得分:0)

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table 
( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
, type TINYINT NOT NULL
, name VARCHAR(100) NOT NULL
, value VARCHAR(100) NOT NULL
, parentId INT NULL
, createdById INT NOT NULL
);

将以下内容绑定到事务中是明智的。

INSERT INTO my_table 
( type
, name
, value
, createdById
) 
VALUES 
( 0
, 'howItWorks'
, 'Some URL'
, -1
);

INSERT INTO my_table 
( type
, name
, value
, parentId
, createdById
)
SELECT 0
     , 'howItWorksThumb'
     , 'Some URL'
     , LAST_INSERT_ID()
     , -1
  FROM my_table;

交易结束

  SELECT * FROM my_table;
  +----+------+-----------------+----------+----------+-------------+
  | id | type | name            | value    | parentId | createdById |
  +----+------+-----------------+----------+----------+-------------+
  |  1 |    0 | howItWorks      | Some URL |     NULL |          -1 |
  |  2 |    0 | howItWorksThumb | Some URL |        1 |          -1 |
  +----+------+-----------------+----------+----------+-------------+

答案 2 :(得分:-1)

查看您创建的表的数据类型。并在您创建的字段上另见DEFAULT。如果ID为NULL,则DEFAULT = auto_increment。