我认为大多数人在将值/数据插入数据库(mysql)时遇到了严重的问题。当我在数据库中插入一个值时,我为该行分配了一个惟一的id (INT)。当我查询数据库时,我可以轻松地读取/修改/删除该行。
使用函数for() (在php中),我可以轻松地从数据库读取值/数据。当我删除一行时(例如在中间),问题就会发生。
例如:
DB:
ID | column1 | column2 | ... | columnN
--------------------------------------
1 | abcdefgh | asdasda | ... | asdasdN
2 | asdasddd | asdasda | ... | asdasdN
...
N | asdewfew | asddsad | ... | asddsaNphp:
for($i = 0; $i <= $n; $i++){
$sql = mysql_query("SELECT * FROM db WHERE ID = '$i' ");
//Code;
}*$n = ID中的最后一列值
我是否需要重组整个数据库才能有一个正确的“流”(1,2,3,..n)?还是我需要更新每个手机?
发布于 2012-01-22 21:52:13
由于mysql中的AUTO_INCREMENT,您在这里所做的一切都是不必要的。从PhpMyAdmin (或另一个DB管理系统)运行此命令:
ALTER TABLE db MODIFY COLUMN ID INT NOT NULL AUTO_INCREMENT;现在,当向db中插入一行时,mysql将为您分配ID:
INSERT INTO db (id, column1, column2) VALUES(NULL, 'abc', 'def');SELECT * FROM db;
+--+-------+-------+
|id|column1|column2|
+--+-------+-------+
|1 |old |oldrow |
+--+-------+-------+
|2 |abc |def | <--- Your newly inserted row, with unique ID
+--+-------+-------+如果删除一行,则确实会出现ID顺序上的不一致,但这是可以的。in并不表示表中某一行的数字位置。它们旨在唯一地标识每一行,以便您可以对其执行操作,并从其他表中引用外键。
另外,如果您需要获取一组ID(例如,存储在数组中),那么使用IN语句执行一次查询要高效得多。
$ids = array(1,2,3,4,5,6);
$in = implode(',', $ids);
mysql_query('SELECT * FROM db WHERE id IN ('.$in.')');但是,如果希望所有行只使用:
SELECT * FROM dbs;但要厌倦鲍比桌。
发布于 2012-01-22 21:44:38
可以使用查询选择所有行。
SELECT * FROM db然后做你想做的事
发布于 2012-01-22 21:46:46
您永远无法确保ids是连续的。正如您自己所注意到的,在删除一行之后会出现空白,但是即使在您在事务中插入行而不提交行时也是如此,因为有些东西失败了,您需要恢复事务。ID是标识符,而不是行号。
例如,如果您想从某个地方(或类似的地方)选择X项,请查看LIMIT和OFFSET
SELECT * FROM mytable ORDER BY created DESC LIMIT 10 OFFSET 20;这将选择按其创建时间排序的行21至30。注意,我不使用id进行排序,但您不能依赖它(如前所述)。
如果您确实希望通过它们的ID来获取行,那么您肯定需要首先获取ID。您还可以获取一系列ID,如
SELECT * FROM mytable WHERE id IN (1,2,3,4);但别以为你会收到4行。
https://stackoverflow.com/questions/8964944
复制相似问题