mysql数据库结构(唯一id)

时间:2012-01-22 21:40:47

标签: php mysql sql

我认为大多数人在将值/数据插入数据库(mysql)时遇到了严重问题。当我将值插入数据库时​​,我为该行分配唯一的ID(INT)。当我查询数据库时,我可以轻松地读取/修改/删除该行。

使用函数for()(在php中)我可以轻松地从数据库中读取值/数据。删除一行(例如中间)时会出现问题。

E.g:

DB:

ID | column1 | column2 | ... | columnN
--------------------------------------
1 | abcdefgh | asdasda | ... | asdasdN
2 | asdasddd | asdasda | ... | asdasdN
...
N | asdewfew | asddsad | ... | asddsaN

PHP:

for($i = 0; $i <= $n; $i++){
   $sql = mysql_query("SELECT * FROM db WHERE ID = '$i' ");
   //Code;
}

* $ n = ID

中的最后一列值

我是否需要重组整个数据库以获得正确的&#34;流程&#34; (1,2,3,.. n)?或者我需要更新每个单元格吗?

6 个答案:

答案 0 :(得分:2)

由于mysql中的AUTO_INCREMENT,你在这里所做的事情是不必要的。从PhpMyAdmin(或其他数据库管理系统)运行此命令:

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的顺序就会出现不一致,但这没关系。 ID不用于表示表中行的数字位置。它们旨在唯一标识每一行,以便您可以对其执行操作并使用外键从其他表中引用它。


此外,如果您需要获取一组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;

但是对bobby tables感到厌倦。

答案 1 :(得分:1)

您可以选择包含查询的所有行

SELECT * FROM db

并在

之后做任何你想做的事

答案 2 :(得分:1)

永远不会确保ID是连续的。正如您注意到自己在删除行之后存在间隙,但即使例如在事务中插入行而未提交行,也因为某些操作失败而您需要还原事务。 ID是标识符,而不是行号。

例如,如果您想从某个地方(或类似地)选择X项,请查看LIMITOFFSET

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行。

答案 3 :(得分:1)

Ids是surrogate keys - 它们绝不是从其余列中的数据中得出的,它们唯一的意义是每行都有一个唯一的行。没有必要改变它们。

如果您需要表格中的特定行范围,请使用BETWEEN在查询中指定它们:

SELECT id, col1, col2, ..., coln
  FROM `table`
  WHERE id BETWEEN ? AND ?
  ORDER BY id

答案 4 :(得分:0)

您不必重新组织整个数据库以保留索引。但如果您愿意,则必须更新每个单元格。

BTW,看看mysql_fetch_array(),它将减轻SQL服务器上的负担。

答案 5 :(得分:0)

如果您需要该表的所有行和所有列,请使用:

$query = mysql_query("SELECT * FROM table_name");

然后使用while语句遍历每一行:

while ($row = mysql_fetch_array($query )) 
{
       echo $row['column_name'];
}