【问题标题】:insert values between rows在行之间插入值
【发布时间】:2012-07-18 21:24:53
【问题描述】:

我不知道它是否可以只用一个 sql 查询或它需要一个 php 代码来完成 当 cid 丢失

存在许多我无法手动处理的缺失值

例如,这里我没有cid=1cid=6。 我要插入一行:

cid=1 tcp_sport='undefined' tcp_dport='undefined'

cid=6 tcp_sport='undefined' tcp_dport='undefined'

在我看来我应该创建一个过程并在行之间插入

我想到的另一个解决方案是,我将创建一个具有 cid 和 undifined 值以及相应顺序的表,然后将这个与那个连接起来,这个连接应该有例如 ifnull(tcp_sport,'')

你能帮帮我吗?

【问题讨论】:

  • 我不会将此非信息添加到数据库中,而是在使用此表的代码中处理它。例如。加入时,您可以使用 LEFT、RIGHT 或 OUTER 联接来处理缺失的行。

标签: php mysql sql database insert


【解决方案1】:

首先,使用MAX获取最大的ID。

SELECT MAX(cid) as max FROM table

然后,创建一个 for 循环来检查各个 ID 是否存在:

for ($i = 0; $i < $max; $i++) {
    // $query = ... SELECT 1 FROM table WHERE cid = $i ...
    // check if the number of rows for $query is greater than 0
    // if not, INSERT INTO table VALUES ($i, DEFAULT, DEFAULT)
}

【讨论】:

    【解决方案2】:

    自动递增 ID 的整个想法是拥有一个只引用一件事的值。通过“插入字里行间”,您可能会面临许多无法预料的问题。图像您有另一个表,其中一些值链接到该表的 CID。如果该表已经有一个 CID=1 的条目,当您插入一个 CID=1 的新项目时,它将加入该支持记录。因此,真正属于 CID=1 的原始项目的数据将显示为可能与之无关的新项目。

    您不会用完 ID 值(如果您接近整数的限制,请将其切换为 bigInt),如果可以避免,请不要重复使用 ID。

    【讨论】:

    • 我无法避免它们我有 46922 行,我创建了一个左连接,这是一个 create view alarm as select i.cid, i.ip_src, i.ip_dst, ifnull(t.tcp_sport,'') as tcp_sport, ifnull(t.tcp_dport, '') as tcp_dport from ipview i,tcpview t where i.cid = t.cid; 然后我遇到了问题,因为 php 我的管理员会崩溃,所以我应该只这样做
    • 该示例不是左连接...并且不应该导致任何问题。 phpMyAdmin 是一个工具,如果它不起作用,请使用另一个工具,不要因为工具有问题而做出错误的 DB 决策。
    • 是的,我混淆了我的意思是加入,但在此之前我也尝试过左加入,这是我的问题,我没有得到正确的答案,但国家对我的帮助更大,所以我接受了stackoverflow.com/questions/11560159/…跨度>
    • 我想也许你的问题太模糊了。很明显,您在这里尝试做一些事情,它可能在基础上存在缺陷,并且直到您上升几个级别时您才能看到该缺陷的影响。如果你继续在这个摇摇欲坠的基础上建设,更多的问题将变得显而易见。您可能需要对您的初始视图创建进行一些咨询才能真正正确地完成此操作。
    【解决方案3】:

    您需要使用 PHP 来自动执行此操作。

    <?php
    
    $link = mysql_connect("localhost", "mysql_user", "mysql_password");
    mysql_select_db("database", $link);
    
    while($i < max_value_cid)//replace max_value_cid by the numeric maximum value of cid (SELECT MAX(cid) as max FROM table)
    {
       $result = mysql_query("SELECT * FROM `table` WHERE cid=".$i, $link);
       if(mysql_num_rows($result) == 0)
       mysql_query("INSERT INTO `table` VALUES ($i, NULL, NULL);", $link);
       $i++;
    }
    ?>
    

    在执行之前在样本集上测试查询,并记得备份整个表,以防万一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 2017-10-25
      • 2011-10-18
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      相关资源
      最近更新 更多