在查看

时间:2017-07-30 13:04:25

标签: php mysql database

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

假设我们有简单的一对多关系(例如ProdTypes和Products)

  • 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条记录(如果未找到则为零)!

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

1 个答案:

答案 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;

}