2017-07-30 119 views
0

我正在构建prog逻辑,该逻辑遍历MySQL模式中的所有表和视图,并为DB持久性创建PHP对象。我的DAO层。这些对象也有CRUD方法,但也有Finder方法。在INFORMATION_SCHEMA中,有关于每个表的信息,哪些列是PK,但不是视图。我需要动态地查看哪些列是View中的PK。在View中查找主键列

比方说,我们有简单的一对多关系(如ProdTypes和产品)

  • ProdTypes [ProdTypeId,ProdTypeName] < - ProdTypeId = PK
  • 产品[PRODID,PRODNAME,ProdTypeId ] < - 两个PRODID = PK,ProdTypeId = FK

和一个视图作为简单的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条记录(如果找不到则返回0)!

问题是如何找出视图中的哪些列唯一地定义(!s)记录!?或者什么是(非官方)主键?

回答

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; 

}