Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试将多个带有while循环的记录添加到由字段定义的MYSQL表中,以防它们不存在_Mysql_Sql_Database_Stored Procedures_Sql Insert - Fatal编程技术网

尝试将多个带有while循环的记录添加到由字段定义的MYSQL表中,以防它们不存在

尝试将多个带有while循环的记录添加到由字段定义的MYSQL表中,以防它们不存在,mysql,sql,database,stored-procedures,sql-insert,Mysql,Sql,Database,Stored Procedures,Sql Insert,我有一张名为Payments的表 这张桌子看起来像这样 HouseNumber| Month | Amount| Status 我有104套房子要管理,从1套到104套,到目前为止,只有5套房子支付了3月份的租金,我在我的表格中插入了这些房子 如果运行此查询: SELECT * FROM Payments WHERE Month = "March" 您将得到以下结果 - HouseNumber| Month | Amount| Status - 1 |March |

我有一张名为Payments的表 这张桌子看起来像这样

HouseNumber| Month | Amount| Status
我有104套房子要管理,从1套到104套,到目前为止,只有5套房子支付了3月份的租金,我在我的表格中插入了这些房子

如果运行此查询:

SELECT * FROM Payments WHERE Month = "March"
您将得到以下结果

 - HouseNumber| Month | Amount| Status 
 - 1          |March  |   370 | Paid
 - 16         |March  |   370 | Paid
 - 24         |March  |   370 | Paid
 - 46         |March  |   370 | Paid
 - 99         |March  |   370 | Paid
我想做的是为其他99间状态为“未付款”的房子做一个插入

我可以想出几个方法来实现这个目标,但我觉得没有一个是最好的实践

我想用99个插销手动操作 或者选择付费门牌号并将其添加到PHP数组中,然后使用PHP循环进行插入 实际上我是带着一个查询出来的,但是我得到了很多语法错误

DELIMITER //

CREATE PROCEDURE myproc()
BEGIN
     DECLARE i INT DEFAULT 1;

    CREATE TEMPORARY TABLE march (housenumber int);

    WHILE (i <= 104) DO

        IF i NOT IN (SELECT `housenumber` FROM Payments WHERE `Month` = "2020-03-01")
            BEGIN
                INSERT INTO March (housenumber) VALUES (i)
                SET i = i + 1
            END

    END WHILE;

    SELECT * FROM marc;
END//

DELIMITER ;

我想只通过一个查询就可以解决这个问题,正如Barmar所评论的,一个典型的解决方案是使用数字表

以下是一个查询,用于创建包含0到999之间所有数字的表:

然后可以使用该表生成原始表中缺少的行:

insert into payments(house_number, month, amount, status)
select n.n, '2020-03-01', 370, 'Not Paid'
from nums n
where 
    n.n between 1 and 104
    and not exists (
        select 1 from payments p where p.month = '2020-03-01' and p.house_number = n.n
    )

正如Barmar所评论的,典型的解决方案包括使用数字表

以下是一个查询,用于创建包含0到999之间所有数字的表:

然后可以使用该表生成原始表中缺少的行:

insert into payments(house_number, month, amount, status)
select n.n, '2020-03-01', 370, 'Not Paid'
from nums n
where 
    n.n between 1 and 104
    and not exists (
        select 1 from payments p where p.month = '2020-03-01' and p.house_number = n.n
    )

最初,使用所有房屋的默认值加载表-

- HouseNumber| Month | Amount| Status 
- 1          |March  |   370 | Not Paid
- 2          |March  |   370 | Not Paid
- 3          |March  |   370 | Not Paid
- 4          |March  |   370 | Not Paid
- 5          |March  |   370 | Not Paid

到104。然后,当房子支付租金时,只需将状态字段更新为“已支付”。这不是更容易吗?

首先用所有房屋的默认值加载您的表-

- HouseNumber| Month | Amount| Status 
- 1          |March  |   370 | Not Paid
- 2          |March  |   370 | Not Paid
- 3          |March  |   370 | Not Paid
- 4          |March  |   370 | Not Paid
- 5          |March  |   370 | Not Paid

到104。然后,当房子支付租金时,只需将状态字段更新为“已支付”。这不是更容易吗?

还有其他表格可以找到104所房子的列表吗?创建一个序列号表格。然后,您可以选择n介于1和104之间的数字,并将其与Payments表连接以获得缺少的数字。是否还有其他表可以找到104栋房屋的列表?创建一个序号表。然后,您可以选择n介于1和104之间的范围内的数字,并将其与Payments表连接以获取缺少的数字。