【问题标题】:Mysql insert value with count of same table coumnMysql插入具有相同表列计数的值
【发布时间】:2020-05-25 19:57:19
【问题描述】:

无法理解为什么这样的事情不起作用,我确实在这里阅读了很多官方文档和答案,但仍然无法弄清楚如何在没有事务的情况下在一个插入查询中完成这项工作,如果可能的话。

我需要类似的东西:

INSERT INTO PREDMETIP
    (`predp_nas`)
VALUES((SELECT COUNT(strp_ID) FROM PREDMETIP WHERE strp_ID = '1')+1,

我需要这个结果:

| predp_id | strp_ID | predp_nas |
| -------- | ------- | --------- |
| 1        | 1       |     1     |
| 2        | 1       |     2     |
| 3        | 1       |     3     |
| 4        | 2       |     1     |
| 5        | 2       |     2     |
| 6        | 3       |     1     |

其中 predp_nas 列是 strp_ID 列的计数 + 1 在每个新插入上。

CREATE TABLE PREDMETIP (
  predp_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  strp_ID INT NOT NULL,
  predp_nas INT(11) NULL
);

INSERT INTO PREDMETIP
    (`strp_ID`)
VALUES(1),(1),(1),(2),(2),(3);

INSERT INTO PREDMETIP
    (`strp_ID`, `predp_nas`)
VALUES(1, 
   (SELECT COUNT(strp_ID) FROM PREDMETIP WHERE strp_ID = '1')+1);

我创建了一个DB fiddle for example

如果您删除最后一个插入是表中的数据,但我需要第二次插入才能工作并给我结果:

| predp_id | strp_ID | predp_nas |
| -------- | ------- | --------- |
| 7        | 1       |     4     |

从正在插入的同一个表中选择计数显然存在问题。话虽如此,我知道如何进行交易并在两个查询中执行此操作。但如果可能的话,我对 1 个查询解决方案感兴趣。我有一份文件,我错过了一些知识来完成这项工作。

提前谢谢你。

【问题讨论】:

    标签: mysql sql select count sql-insert


    【解决方案1】:

    看起来你想要insert ... select 语法:

    INSERT INTO PREDMETIP(strp_ID, predp_nas)
    SELECT 1, COUNT(*) + 1 FROM PREDMETIP WHERE strp_ID = 1
    

    【讨论】:

    • 谢谢,但不,查询比示例大得多。这只是我需要在插入时计算的一列值。 Aldo 这当然也适用于示例。
    • @ikiK 。 . .我认为这是对您提出的问题的最佳答案。
    • @GordonLinoff 老实说,我很难理解这甚至是如何工作的。而且我无法让它在我的生产查询中工作,女巫更大并且使用值语法。 (在标题和示例中提到了女巫)。我必须在这里错过一些逻辑或其他东西。请记住 1 实际上是一个 PHP 变量。我很困惑,它在示例中有效。
    • @ikiK:您通常会在 SELECT 中将其他变量作为文字传递,例如:SELECT :var1, :var2, :var3, OUNT(*) + 1 FROM PREDMETIP WHERE strp_ID = :var1...
    【解决方案2】:

    MySql 不允许在插入、删除和更新时直接引用更新的表。
    您必须像这样将查询嵌套在另一个查询中:

    INSERT INTO PREDMETIP
        (`strp_ID`, `predp_nas`)
    VALUES(
     1, 
     (SELECT counter + 1 FROM (SELECT COUNT(strp_ID) counter FROM PREDMETIP WHERE strp_ID = '1') t)
    );
    

    请参阅demo

    【讨论】:

      【解决方案3】:

      您需要为内部选择指定一个别名,如下所示,以将其与主查询区分开来。

      INSERT INTO PREDMETIP
      (`strp_ID`, `predp_nas`)
      VALUES(1,  (SELECT COUNT(strp_ID) FROM PREDMETIP p WHERE p.strp_ID = '1')+1);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-22
        • 1970-01-01
        • 1970-01-01
        • 2022-08-03
        • 1970-01-01
        • 2013-05-26
        • 1970-01-01
        • 2015-11-03
        相关资源
        最近更新 更多