无法按栏插入值

时间:2019-03-20 18:41:22

标签: java mysql sql

这是我在网站上的第一个问题,请原谅:)

我在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();
}

}

3 个答案:

答案 0 :(得分:2)

games可能正在使用InnoDB存储引擎,并且已定义了PRIMARY KEYUNIQUE 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)

关系数据库通常不以任何特定顺序存储记录。数据库引擎将执行所需的操作。通常,您不可能做的事,或者只是针对特定用例而设计的。

对于SQL Server: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/81dc5d09-a6b0-4be3-9dc6-e5fde0171365/can-i-sort-an-sql-table?forum=transactsql

对于Oracle: Oracle SQL - Order data stored in a database

对于MySQL: Best way to change order of rows in MySQL table?