这是我在网站上的第一个问题,请原谅:)
我在sql中有一个项目,我尝试以在这里看到的方式对我的一个表进行排序-
您将不得不使用第二张桌子
使用与游戏桌相同的结构创建一个新的桌游戏2,并确保ID自动递增
CREATE TABLE `games2` LIKE `games`; copy the data, sorted, into games2
INSERT INTO `games2` (`Name`, `SomeDescription`) SELECT `Name`, `SomeDescription` FROM `games` ORDER BY `Name` drop or move the old table
-- DROP TABLE `games`;
-- or
RENAME TABLE `games` TO `games1`; rename new table to old name
RENAME TABLE `games2` TO `games`;
不幸的是,它确实能够完成所有行,但是没有对代码进行排序。只能创建与旧游戏完全相同的新桌面游戏
如果有帮助,这是我的代码:)
try {
stt1.executeUpdate("CREATE TABLE IF NOT EXISTS topten2" +
"(username varchar(50) not NULL UNIQUE," +
"country varchar(50) not NULL," +
"score int)");
stt1.executeUpdate("INSERT INTO topten2 (username, country, score) SELECT * FROM topten ORDER BY score");
stt1.executeUpdate("RENAME TABLE topten TO topten1");
stt1.executeUpdate("RENAME TABLE topten2 TO topten");
} catch (SQLException e) {
e.printStackTrace();
}
}
答案 0 :(得分:2)
表games
可能正在使用InnoDB存储引擎,并且已定义了PRIMARY KEY
或UNIQUE KEY
。 (但我们只是在猜测。)InnoDB表始终由集群键(一组非NULL列上的PRIMARY KEY或UNIQUE KEY)“按顺序”存储。重要说明:InnoDB表中行的这种物理顺序是实现的产物。 InnoDB始终使用集群密钥。 MySQL中的其他存储引擎没有这个怪癖。表格是无序行集。要按指定顺序返回行,我们使用ORDER BT
子句。
使用CREATE TABLE LIKE
语句(如问题所示)将创建原始表包括键定义的副本。插入行的顺序无关紧要,它们将通过集群键以物理方式按顺序存储...再次,因为它使用的是InnoDB存储引擎。
存储行的物理顺序并不重要。根据关系理论,关系是无序的元组集。表是在关系数据库中实现的,是一组无序的行。
要添加auto_increment列,需要将其定义为具有AUTO_INCREMENT
属性的整数类型列。 (请注意,我们可以使用ALTER TABLE
语句向表中添加一列。)
看起来要求是实现代理键以用作表的PRIMARY KEY
(群集键)。创建表的副本是实现此目的的一种方法,还有其他方法。
我们如何做到这一点。获取现有表的定义:
SHOW CREATE TABLE `mytable` ;
然后,我们采用DDL并对其进行修改以更改表的名称,并包括一个新的整数AUTO_INCREMENT列作为PRIMARY KEY,如下所示:
CREATE TABLE mytable2
( id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'PK'
, username VARCHAR(50) NOT NULL UNIQUE COMMENT 'UX'
, country VARCHAR(50) NOT NULL
, score INT
);
然后,我们可以“复制”旧表中的行,为id列提供NULL值,以便自动分配值。
INSERT INTO mytable2 (id, username, country, score)
SELECT NULL, s.username, s.country, s.score
FROM mytable s
ORDER BY s.score
;
然后重命名:
RENAME TABLE mytable TO mytable1
;
RENAME TABLE mytable2 TO mytable
;
答案 1 :(得分:1)
我推断您的期望是,在执行了该过程之后,默认情况下,所涉及表上的SELECT
查询将以插入时的顺序返回行。尽管有the answer on which you modeled your code的任何断言,但这都不是安全的假设。可能会发生这种情况,但不能完全确定,当然也没有理由期望在进行任何进一步的插入或删除操作后,这种固有的顺序仍然存在。
代码所能实现的最大目标是为现有行重新分配自动生成的主键值,使其与使用的排序键的顺序保持一致。充其量是没有用的。但是,如果您的数据库在修改后的表上包含外键关系,则该过程将完全失败或将破坏这些关系。
SQL没有 table 的顺序。相反,它通过ORDER BY
查询的SELECT
子句提供结果排序。如果您关心查询结果的顺序,则可以在查询中指定所需的顺序,而无需修改基础表。例如,
SELECT Name, SomeDescription
FROM games
ORDER BY Name;
尽管在没有ORDER BY
子句的情况下,实现通常会表现出特有的结果顺序特征,但是当您省略ORDER BY
时,您不应对结果顺序做任何假设。
答案 2 :(得分:0)
关系数据库通常不以任何特定顺序存储记录。数据库引擎将执行所需的操作。通常,您不可能做的事,或者只是针对特定用例而设计的。