我只是想知道是否有办法在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;
}
一些注释:
$table
只来自代码中的文字字符串,绝不是来自外部来源。$key
已正确转义。mysql
,因为我使用的是PHP 5.4 $ret = []
是定义数组的一种非常有效的方法 - 我这样说是因为在我的上一个问题中,人们告诉我我的代码因为这种语法而无效。 现在,我当前的实际工作代码有一个关联数组映射表名到它们对应的主键字段名。我只是想知道是否有一种自动方式来执行此操作,最好是不需要查询INFORMATION_SCHEMA
,SHOW CREATE TABLE
或SHOW INDEXES
。
答案 0 :(得分:2)
不,在不知道或查询主键列的情况下,没有自动执行此操作的方法。
请注意,主键可能不止一列!
我在Zend Framework 1.0中实现了这种通用的find-by-primary-key方法。我们必须为表网关类编写代码以发现表的主键和所有其他列。
使用DESC
作为SHOW CREATE TABLE
的更快替代方案或查询INFORMATION_SCHEMA
。 SHOW
命令只映射到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);