是否可以使用INSERT命令将数据插入表的中间部分?

时间:2010-11-08 19:18:21

标签: sql mysql database insert

示例:

INDEX | SOME_DATA

1 | some_data1

3 | some_data3

4 | some_data4

5 | some_data5

我想要一个INSERT来添加---> 2 | some_data2。 是否有SQL命令或某种方法?

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

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

4 个答案:

答案 0 :(得分:6)

只需插入数据;桌子没有从根本上订购。当您在select语句中自己定义表结果时,会发生表结果的唯一排序。

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

答案 1 :(得分:5)

您应该能够像常规一样添加它:

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

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

ALTER TABLE some_table ORDER BY index;

一般而言,订单实际上并不重要。您应该在找到的列上使用索引,在获取结果集时使用ORDER BY。您不应该依赖表中行的插入顺序来进行优化或排序。

答案 2 :(得分:2)

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

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

然而,担心连续的主键是一个坏主意。他们的工作应该是唯一地确定行,而不是其他。

答案 3 :(得分:1)

好的,我正在再次回答,因为您的更新显示您提出的问题与每个人都认为的完全不同。

您描述的方法 - 更新已移动行的索引以及后面列表中的每个索引 - 这里是正确的方法。

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

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

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

您也可能想重新考虑将“索引”列重命名为“位置”,以避免混淆与实际MySQL索引的命名。