【问题标题】:Is it possible to insert data into the mid section of a table using the INSERT command?是否可以使用 INSERT 命令将数据插入到表的中间部分?
【发布时间】:2011-05-06 20:16:10
【问题描述】:

例子:

索引 |一些数据

1 | some_data1

3 | some_data3

4 | some_data4

5 | some_data5

我想做一个 INSERT 来添加 ---> 2 |一些数据2。 是否有 SQL 命令或某种方式来执行此操作?

[编辑]
好的。也许如果我解释我想要完成的每一件事,你就会明白为什么我要尝试做我想做的事情。我在 php 中创建了一个 Web 管理页面,它只显示来自数据库表的数据。现在这些显示的行是“可拖动的”。例如,您可以将第 2 行拖到第 4 行。现在在“mouseup”事件中,我想将新订单保存在数据库中。

1|数据1 -------------> 1|数据1
2| data2 --------拖动后-----> 3|数据3
3|数据3 -------------> 4|数据4
4|数据4 -------------> 2|数据2
看到我的问题了吗?我不能仅仅为被拖动的一个值更新 INDEX 列中的值。我将不得不更新所有被拖过来的值。 3 必须变成 2,4 必须变成 3,2 必须变成新的 4。那是太多的 sql 更新(特别是如果表更大)。所以我想删除第 2 行并将其插入正确的位置。

【问题讨论】:

  • 如果INDEX是你的自增列,我相信你可以在INSERT语句中指定行号。但是,除非您对该列进行排序,否则它不会以正确的顺序出现(例如在 phpMyAdmin 中)。
  • 你不能依赖行的自然顺序,真的。我怀疑您是否可以轻松更改它,除了在插入后删除并重新插入每一行。

标签: sql mysql database insert


【解决方案1】:

只需插入数据;表格基本上没有排序。表结果的唯一排序发生在您自己在 select 语句中定义时。

编辑:如果您想要一个单独的订单,那么拥有一个单独的“订单”列会很好。我建议将其设为浮点类型,这样您就可以在其他条目之间的任何位置插入条目而无需任何更新。例如,如果您有“订单”列值为“1”的条目“A”,“订单”列值为“2”的条目“B”,并且您想要插入条目“C”,以便它显示在条目之间“ A”和条目“B”,只需将“订单”列值设置为 1.5 (1 + 2 / 2.0) 插入它。这样,您可以在“订单”列上使用“订单依据”来执行您的选择,事情应该会按照您想要的方式进行。浮点数是解决这个问题的一个相当不错的解决方案,因为有足够的空间来支持大量“中间”添加。

【讨论】:

  • MySQL是否允许插入新记录并指定索引?
  • @hunter:是的;在这种情况下,“index”是您在表中的列名。
  • +1 提到 SQL 表是基于集合的,并且它们本身不是“有序”的。重要的概念!
  • @djacobson,实际上 MySQL 中的行有一个自然的顺序——插入顺序——你可以使用 ALTER TABLE 命令重新排序。但是,您也应该认为数据是基于集合的和未排序的,而不是出于任何目的使用自然顺序。 @the face,是的,你可以这样做。请参阅我的答案的更新。但也请参阅我添加的注释,解释为什么这对您不重要。
  • @theface:使用 SQL,您将数据插入一行;行出现的顺序仅由您的 SQL 语句决定。因此,“SELECT * from your_table”在技术上可以按任何顺序给出行;要按索引值升序排列它们,您必须使用“SELECT * from your_table ORDER BY index ASC”之类的内容。
【解决方案2】:

您应该可以像常规一样添加它:

INSERT INTO some_table (index, some_data) VALUES (2, 'some_data2')

插入后,如果您确实希望行按索引排序,请运行以下命令:

ALTER TABLE some_table ORDER BY index;

一般来说,虽然顺序真的不重要。您应该对确实找到的列使用索引,并在获取结果集时使用 ORDER BY。您不应依赖表中行的插入顺序来进行优化或排序。

【讨论】:

  • 但这不会将数据添加到表格的底部吗?
  • @the face,如果您收到行的顺序对您很重要,您应该在查询中的某些条件上使用order by 来指定它。在这种情况下,您可以使用order by index
  • @the face -- 我添加了一个更新来解释如何重新排序行。一般来说,顺序实际上并不重要。您应该对确实找到的列使用索引,并在获取结果集时使用 ORDER BY。您不应该依赖表中行的插入顺序来进行优化或排序。
  • +1 表示alter table ... order by。值得阅读the documentation 中的建议和注意事项。
【解决方案3】:

可以,插入时可以指定行的主键。

insert into yourtablename (index, some_data) values (2, "some_data2");

但是担心拥有连续的主键是个坏主意。他们的工作应该是唯一标识行,仅此而已。

【讨论】:

  • @hunter,如果您要插入一个从未使用过的行,那么我同意您的看法。虽然缺少的行表明那里有一个先前的值,但在这种情况下,我认为在许多情况下最好附加(到数据库和枚举),以便现有软件在请求该行时收到错误而不是错误的值。
【解决方案4】:

好的,我再次回答,因为您的更新显示您提出的问题与大家认为的完全不同。

您描述的方法 -- 更新移动行的索引和列表中的每一行 -- 正是这里正确的方法。

为什么说“sql 更新太多了”?只要您将MySQL index 应用于index 列,这些更新就会很快,即使对于非常大的列表(它们将在毫秒级)。

我认为您要么在进行预优化,要么没有定义索引。要添加索引(如果您还没有索引),请运行以下命令:

CREATE INDEX row_index_index ON `some_table` (`index`);

您可能还需要重新考虑将“索引”列重命名为“位置”之类的名称,以避免将命名法与实际的 MySQL 索引混淆。

【讨论】:

  • 问题是,我不太擅长 SQL,所以我真的不知道它的速度有多快。所以你说它会很快(即使该表有大约 200 条记录)?如果那是真的,那我会的,坚持我原来的。等待您的回复。
  • 是的,添加索引后,速度会非常快。即使表有 200 条记录,即使被更改的列表有几十个项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多