【问题标题】:row order when inserting multplie rows in MySQL在 MySQL 中插入多行时的行顺序
【发布时间】:2009-12-23 02:07:07
【问题描述】:

在 PHP 中,我创建并执行如下 SQL 查询。

INSERT INTO Table (Column1, Column2, Column3) VALUES
('1', '2', '3'),
('A', 'B', 'C'),
('AA', 'BB', 'CC');

但是,每次我尝试这样做时,它们插入数据库的顺序都不同。有没有办法可以确保它们按列出的顺序插入?

补充: 谢谢大家的帮助。我有一段时间使用 PHP 从 CSV 文件创建 MySQL 表。过去,我总是使用创建一个表并一次插入所有行。在这些情况下,SQL 表的顺序总是与我的 INSERT 查询相同。但是,现在我正在创建一个 MySQL,然后逐渐添加内容。这是数据库顺序变得随机的时候。

我已经通过使用 ALTER TABLE ... ORDER BY 查询克服了这个问题,但我很好奇,因为在第一种情况下有顺序,现在看起来很随机。

【问题讨论】:

标签: php sql mysql


【解决方案1】:

默认顺序是插入语句执行的顺序。除非行之间存在层次关系,否则插入的顺序是无关紧要的。如果您希望以一致的方式输出,您必须在查询中定义 ORDER BY 子句。

【讨论】:

  • 请注意,这仅与参照完整性有关。
  • @Leprechuan:没错,我说的是关于提供的示例。
  • 有人可以建议有关广告订单的信息在哪里吗?找不到。测试插入 1000 行:插入 table (Column) 值 (1)、(2)、(3) 等。在 mysql 中看到与我提供的相同的顺序。但是找不到文档是按照mysql插入值的顺序写的。
【解决方案2】:

如果您想按特定顺序检索行,唯一确定的方法是使用 ORDER BY 子句。

【讨论】:

    【解决方案3】:

    它们的插入顺序并不那么重要,因为在提取数据时您可能会在查询中使用ORDER BY 子句。请记住,MySQL 是用于存储数据的,而不一定是呈现数据的。

    SELECT col1, col2
    FROM table1
    ORDER BY col2 ASC // fixes any ordering issues in the native-storage
    

    【讨论】:

      【解决方案4】:

      关系永远不会定义顺序,因此您不能依赖它。您可以使用 ORDER BY 子句来获得所需的结果。

      【讨论】:

        【解决方案5】:

        有一种方法可以保证它们的插入顺序:

        INSERT INTO Table (Column1, Column2, Column3) VALUES ('1', '2', '3');
        INSERT INTO Table (Column1, Column2, Column3) VALUES ('A', 'B', 'C');
        INSERT INTO Table (Column1, Column2, Column3) VALUES ('AA', 'BB', 'CC');
        

        :-)

        但是您需要了解 SQL 是一种关系代数,它使用结果集,并且插入的顺序无关紧要。除非其中一列是某种时间戳,或者您有一个自动递增字段,您希望按特定顺序为三行设置,否则这无关紧要(这两个实际上都不是想要顺序的好理由控制)。

        除非您指定您希望它们的顺序,否则您在提取行时无法保证任何特定的顺序,因此您不必担心它们的创建顺序。如果没有order by 子句,每次执行select 时,顺序实际上都会发生变化。

        【讨论】:

        • 请注意,这个答案非常低效,因为它需要三个(或更多)单独的查询才能完成一个可以完成的任务。对于相关的 php 程序员来说,遵循之前帖子中的建议会更加谨慎。
        • 你没看到笑脸吗,@eykanal?在任何情况下,其他答案都不能真正保证插入顺序,这是 OP 要求的 - 这个答案可以做到这一点,但它可能是不必要的。除此之外,我的建议与其他建议相同:很可能没有必要,因为如果您想要订购数据集,则应该使用 order-by 选择,如果您不想要, 绝对不保证你会得到一个特定的(甚至是一致的)订单。
        • +1 因为@paxdiablo 的答案是正确的答案。可能效率低下,但这正是布赖恩所问的:“有没有一种方法可以确保它们按列出的顺序插入?”
        【解决方案6】:

        尽管 DBMS 不能保证插入的顺序,但它通常是 FIFO。先进先出。

        【讨论】:

        • 甚至没有关闭。 DBMS 产生无序数据集的顺序差异很大,从主键顺序、其他索引顺序(取决于 where 子句)、受聚集索引影响的顺序,甚至随机顺序,取决于您是否必须进行全表扫描和插入和删除的历史。
        【解决方案7】:

        没有办法(据我所知)强制 INSERT 语句以特定顺序出现。只是做一个简单的选择,例如:

        SELECT * FROM Table
        

        也不总是以相同的顺序返回数据。这是因为 MySQL(和所有其他数据库系统)用于存储数据,开发人员可以适当地查询它。幸运的是,有许多不同的方式来排序、限制和选择数据,例如:

        ORDER BY column_name ASC
        LIMIT 10
        WHERE column_name = "test"
        WHERE column_name IN (1, 2, 3)
        --etc
        

        【讨论】:

          猜你喜欢
          • 2018-12-02
          • 1970-01-01
          • 2018-04-17
          • 2011-10-16
          • 1970-01-01
          相关资源
          最近更新 更多