我正在构建prog逻辑,它遍历MySQL模式中的所有表和视图,并为DB持久性创建PHP对象。我的DAO层。这些对象也有CRUD方法,但也有Finder方法。在INFORMATION_SCHEMA中,有关于每个表的PK是哪个列的信息,而不是视图的列。我需要在View中动态查找哪个列是PK。
假设我们有简单的一对多关系(例如ProdTypes和Products)
视图是两个连接表的简单SELECT:
SELECT p.prodid,p.prodname,t.prodtypename
FROM products p
JOIN prodtypes t ON t.prodtypeid=p.prodtypeid
当一个人创建这样的视图时,MySQL会在INFORMATION_SCHEMA中说这个视图没有主键(好的,因为它的视图)。但我们知道ProdId
是在此视图中唯一定义记录的列!因此,尽管它不是正式的PK,但是此列在视图中具有此功能,并且可以假设为PK。可以创建findByProdId()
方法,该方法将始终返回1条记录(如果未找到则为零)!
问题是如何找出视图中唯一定义(!s)记录的列!?或者视图中的(非官方)主键是什么?
答案 0 :(得分:0)
您无法提取或搜索视图的主键。视图可以是复杂连接,因此您将确定所涉及的每个表的主键,而不一定所选字段是主键的一部分。只有在视图查询包含单个表时才能确定视图中主键的唯一时间,并且只有在所选字段包含构成主键的字段时才有意义。
另一方面,当您在PHP中执行sql语句时,您始终可以访问元数据。元数据是每个字段的对象。该对象具有以下属性:
function mysqlMetadata(& $db) {
$id = $db->Query_ID;
$META = new stdClass();
$count = @mysql_num_fields($id);
$META->cols = array();
for($ix=0;$ix<$count;$ix++) {
$col = @mysql_field_name ($id, $ix);
$type = @mysql_field_type ($id, $ix);
$standarType = MetaStandardType("MYSQL",$type);
$META->colsbyname[ "$col" ] = new stdClass();
$META->colsbyname[ "$col" ]->{"type"} = $standarType;
$META->colsbyname[ "$col" ]->{"type_raw"} = $type;
$META->colsbyname[ "$col" ]->{"size"} = @mysql_field_len ($id, $ix);
$META->colsbyname[ "$col" ]->{"precision"}= 0;
$META->colsbyname[ "$col" ]->{"scale"} = 0;
$META->colsbyname[ "$col" ]->{"is_null"} = 1;
$META->colsbyname[ "$col" ]->{"flags"} = @mysql_field_flags ($id, $ix);
$META->colsbyname[ "$col" ]->{"is_null"} = !(MYSQLI_NOT_NULL_FLAG & $property->flags) ;// decbin($property->flags ); //1;
$META->colsbyname[ "$col" ]->{"primary_key"} = !(!(MYSQLI_PRI_KEY_FLAG & $property->flags)) ;// decbin($property->flags ); //1;
$META->colsbyname[ "$col" ]->{"auto_increment"} = !(!(MYSQLI_AUTO_INCREMENT_FLAG & $property->flags)) ;// decbin($property->flags ); //1;
}
return $META;
}