我有一个PHP页面,它与这个小型MySQL数据库表交互,结构简单。 ID
,Name
,Address
是字段。 ID
是主键。
+------+------------+-------------+
| ID | Name | Country |
|______|____________|_____________|
| E001 | Stephen | America |
| E002 | John | Britain |
| E003 | Kate | Canada |
| E004 | Carlos | Spain |
| E005 | James | Australia |
|______|____________|_____________|
如果我删除 E003 上的记录,则看起来像这样。
+------+------------+-------------+
| ID | Name | Country |
|______|____________|_____________|
| E001 | Stephen | America |
| E002 | John | Britain |
| E004 | Carlos | Spain |
| E005 | James | Australia |
|______|____________|_____________|
E002 与 E004 之间出现差距。
有没有办法填写这个差距?喜欢这个
+------+------------+-------------+
| ID | Name | Country |
|______|____________|_____________|
| E001 | Stephen | America |
| E002 | John | Britain |
| E003 | Carlos | Spain |
| E004 | James | Australia |
|______|____________|_____________|
早期记录 E004 ,落入 E003 的位置。前 E005 获得数字 E004 ,依此类推。就像记录退后一步。
有没有办法以编程方式执行此操作?
答案 0 :(得分:1)
你需要重新编号吗?关键值应该不重要。如果它们(即,它们用于外部目的),考虑将外部键作为表中的常规列,并使主键是自动增量整数字段。即使你这样做,你仍然可能不应该重新编号键。这意味着所有外部依赖关系也需要更新。这样做没什么价值。
但是,如果你必须......
如果密钥是自动递增的(应该是),您可以这样做:
ALTER TABLE MyTable DROP ID;
ALTER TABLE MyTable ADD COLUMN ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST;
如果不是,那么你可以做几件事,但最简单的可能是使用变量来充当计数器。为了简化这一点,请不要使用字符串主键,而是使用普通的数字主键。
SET @id = 0;
UPDATE MyTable
SET ID = (@id := @id + 1)
ORDER BY ID;
答案 1 :(得分:1)
在您的数据库表中,ID是主键,它是字母数字。
我认为这不是重新排列表中主键的好方法。它与其他表的所有关系都会混乱。
尝试使用数字主键而不是字符串。
如果使用数字主键,则可以通过删除并使用自动增量重新创建主键列来重新排列它们。
答案 2 :(得分:0)
由于您的ID
字段不是integer
字段,因此只需一个查询就无法执行此操作,并且您需要在间隙之后对所有记录执行循环并更新ID字段。
但更好的方法可能是将ID
字段类型更改为自动递增无符号整数,然后在间隙等于ID
之前知道最后gID
您可以执行查询像这样:
UPDATE table_name SET `ID` = (`ID` - 1) WHERE `ID` > gID;
然后你只需要更新你的auto_increment值:
ALTER TABLE `table_name` AUTO_INCREMENT = (SELEC `ID` FROM `table_name` ORDER BY `ID` DESC LIMIT 1);
由于ID
字段中的所有记录都有共同字母'E',因此可能会删除此字母并将字段类型更改为AUTO INCREMENT UNSIGNED INTEGER