我有一个我在phpMyAdmin中打开的数据库。我点击了“插入”按钮,其中有一个图标,显示在另外两个之间插入了一行。
当我实际尝试插入一行时,出现以下错误:
我如何让phpMyAdmin插入一行(大概是通过将所有较高编号的行增加1)作为图标而术语“插入”意味着什么?它似乎只想在行末“添加”一行,而不是“插入”它。
正如我所说,图标专门显示在两个其他人之间插入一行,这就是我想要做的。如何让它做它声称会做的事情?
答案 0 :(得分:0)
首先,“INSERT”是用于在数据库中放置内容的标准SQL术语;它没有具体意味着“将它置于两个现有值之间”。我看到图标有点令人困惑,但是当“插入”数据时,在数据库的末尾或中间放置一些东西没有区别。就此而言,数据库中存储的数据没有真正的固有顺序;当你显示数据时,你可以选择许多不同的方式对它进行排序(而phpMyAdmin通常可以很好地猜测什么是合理的),但数据才存在。您可以选择按主键对其进行排序,也可以按用户名或任何方式按字母顺序对其进行排序。
其次,您的主键不应更改。这是将数据保存在一起的关键;如果你开始改变你的其他表的引用将搞砸(见下文)。所以不要改变它。
第三,如果您的主键设置为auto_increment(phpMyAdmin中的A_I
复选框),那么您不需要自己设置或担心它。它全部由MySQL管理。如果您对订单不满意并希望将294移动到295以便在294处插入其他内容,那么您的数据库设计需要调整,因为这不是auto_incrementing主键的设计方式。作为一个简单的解决方案,您可能希望创建另一个名为“sort_value”的字段或您可以更改的字段。
这一切都让我了解了你的麻烦的根本原因:你正在尝试在重用现有的auto_increment值时创建一个新行,并且MySQL非常聪明地知道这是一个坏主意。
正如我上面所说,更改主键(无论是否自动生成)是一个坏主意,但如果你只有一个表,可能并不明显。但是关系数据库的设计使您可以引用其他表中的表,因此例如客户数据库可能具有“客户”,“产品”和“购买”的表,其中购买表引用来自两个客户的主键ID和产品......想象一下,如果您随后更改了客户表中这些键的值,您的数据将会看到大屠杀。您将向客户展示与其他客户的购买相关联的信息。因此,在您的数据库中可能没有意义,但总体而言,这是处理事情的最佳方式。
如果你真的,真的不想改变你的数据库结构,不要从任何其他表中引用该键,并且不想听取我的建议,你应该能够简单地关闭auto_increment在您的主键上运行,并根据需要对它们重新排序。