无论列名如何,都选择主键?

时间:2013-01-13 23:42:00

标签: mysql

我只是想知道是否有办法在WHERE子句中使用主键选择一行,而不必知道密钥列的名称。

我建议的PHP功能如下:

function getData($table,$key,$asarray=false) {
    $sql = mysql_query("select * from `".$table."` where primary='".$key."'");
    if( !$asarray) return mysql_fetch_assoc($sql);
    $ret = [];
    while($row = mysql_fetch_assoc($sql)) $ret[] = $row;
    return $ret;
}

一些注释:

  1. $table只来自代码中的文字字符串,绝不是来自外部来源。
  2. 出于此问题的目的,假设已$key已正确转义。
  3. 我不在乎PHP {5.5}中不推荐使用mysql,因为我使用的是PHP 5.4
  4. 出于同样的原因$ret = []是定义数组的一种非常有效的方法 - 我这样说是因为在我的上一个问题中,人们告诉我我的代码因为这种语法而无效。
  5. 现在,我当前的实际工作代码有一个关联数组映射表名到它们对应的主键字段名。我只是想知道是否有一种自动方式来执行此操作,最好是不需要查询INFORMATION_SCHEMASHOW CREATE TABLESHOW INDEXES

3 个答案:

答案 0 :(得分:2)

不,在不知道或查询主键列的情况下,没有自动执行此操作的方法。

请注意,主键可能不止一列!

我在Zend Framework 1.0中实现了这种通用的find-by-primary-key方法。我们必须为表网关类编写代码以发现表的主键和所有其他列。

使用DESC作为SHOW CREATE TABLE的更快替代方案或查询INFORMATION_SCHEMASHOW命令只映射到INFORMATION_SCHEMA的查询,并且成本很高,因为它会触发InnoDB表重新读取一部分表以刷新内存中的统计信息({{3} })。

答案 1 :(得分:2)

这需要再次调用mysql服务器,但这应该可以帮到你找到你想要的东西:

SHOW KEYS FROM table WHERE Key_name = 'PRIMARY'

答案 2 :(得分:1)

我使用Zend Framework 1来做这类事情。

只需从Zend_Db_Table对象执行find()并传递您想要的密钥:

$table = new Zend_Db_Table($table);
$rows = $table->find($key);