是否可以在MySQL表的顶部插入新行?

时间:2011-10-13 11:38:55

标签: mysql

MySQL表中的所有行都按如下方式插入:

1
2
3个

有没有办法在表格的顶部插入新行,以便表格看起来像这样?

3
2
1个

是的,是的,我知道“按顺序”,但让我解释一下这个问题。我有一个约会网站,用户可以按性别,年龄,城市等搜索个人资料。有超过20个搜索条件,并且不可能为每个可能的组合创建索引。因此,如果我使用“order by”,搜索通常以“using temporary,using filesort”结束,这会导致非常高的服务器负载。如果我删除“order by”,则最旧的配置文件显示为第一个,用户必须转到最后一页才能看到新的配置文件。这非常糟糕,因为搜索结果的第一页看起来总是一样,用户感觉没有新的个人资料。这就是我问这个问题的原因。如果无法在表格顶部插入最后一行,您能否提出其他建议?

5 个答案:

答案 0 :(得分:8)

没有ORDER BY子句时返回结果的顺序取决于RDBM。对于MySQL或至少大多数引擎,如果您没有明确指定它将从最旧到新条目的升序。行位于“物理上”无关紧要。我不确定所有的mysql引擎是否都能以这种方式工作。即,在PostgreSQL中,“默认”顺序首先显示最近更新的行。这可能是一些MySQL引擎的工作方式。

无论如何,关键是 - 如果你想要结果排序 - 总是指定排序顺序,不要只依赖于似乎有用的默认值。在你的情况下,你想要一些微不足道的东西 - 你希望用户按降序排列,所以只需使用:

SELECT * FROM users ORDER BY id DESC

答案 1 :(得分:4)

我认为您只需要确保如果您始终需要首先显示最新数据,那么所有索引都需要先指定日期/时间字段,并且所有查询首先按该字段排序。

如果ORDER BY减慢了一切,那么你需要优化你的查询或数据库结构。

答案 2 :(得分:0)

通常您指定auto_incrementing主键。

但是,你可以像这样指定主键:

CREATE TABLE table1 (
  id signed integer primary key default 1, <<-- no auto_increment, but has a default value
  other fields .....

现在添加一个更改主键的BEFORE INSERT触发器。

DELIMITER $$

CREATE TRIGGER ai_table1_each BEFORE INSERT ON table1 FOR EACH ROW
BEGIN
  DECLARE new_id INTEGER;
  SELECT COALESCE(MIN(id), 0) -1 INTO new_id FROM table1;
  SET NEW.id = new_id;
END $$

DELIMITER ; 

现在你的id将从-1开始并从那里开始运行 插入触发器将确保不会发生并发问题。

答案 3 :(得分:0)

我知道自从提出上述问题以来已经过了很多时间。但我要在评论中添加一些内容:

我使用的是MySQL版本:5.7.18-0ubuntu0.16.04.1

如果没有 ORDER BY 子句与 SELECT 一起使用,则表明记录会在表格中显示,而不管它们的添加顺序如何。 s Prime键序列。

答案 4 :(得分:-1)

也许如果你手动添加id'并给它一个负值,但是我(可能没有人)会建议你这样做:

  1. 常规插入,例如

    插入t值(...);

  2. 使用set更新,例如

    update t set id = -id where id = last_insert_id();