发现Sybase ASE中的主键/唯一键:正则表达式和PHP

时间:2011-12-27 02:07:52

标签: php sql regex sybase-ase

我从 sp_helpconstraint iyas_grandtest获取此信息。

constraint_name         definition
iyas_grand_2317208971   PRIMARY KEY INDEX ( id) : CLUSTERED
iyas_grand_2317208972   UNIQUE INDEX ( unik) : NONCLUSTERED
iyas_grand_2317208973   UNIQUE INDEX ( comp_unik1, comp_unik2) : NONCLUSTERED

我想提取:

    来自PRIMARY的
  1. id,
  2. unik来自UNIQUE,
  3. 来自UNIQUE的comp_unik1和comp_unik2
  4. 如下:

    1. $ keys [] = id
    2. $ unique ['iyas_grand_2317208972'] [] = unik
    3. $ unique ['iyas_grand_2317208973'] [] = comp_unik1
    4. $ unique ['iyas_grand_2317208973'] [] = comp_unik1
    5. 请注意,有时PRIMARY键可能是PRIMARY KEY INDEX(id,id2)。

      我现在所拥有的缺陷(只检测复合键的1个键,如果有_则截断名称,即'comp_unik1'变为'comp')。

      $sql = sybase_query("sp_helpconstraint iyas_grandtest");        
      while( $row = sybase_fetch_assoc($sql) ) {
                  $txt= $row['definition'];
                  $re1='(PRIMARY)';   # Word 1
                  $re2='.*?'; # Non-greedy match on filler
                  $re3='(?:[a-z][a-z]+)'; # Uninteresting: word
                  $re4='.*?'; # Non-greedy match on filler
                  $re5='(?:[a-z][a-z]+)'; # Uninteresting: word
                  $re6='.*?'; # Non-greedy match on filler
                  $re7='((?:[a-z][a-z]+))';   # Word 2
      
                   if ($c=preg_match_all ("/".$re1.$re2.$re3.$re4.$re5.$re6.$re7."/is", $txt, $matches))
                  {
                      $word =$matches[2][0];
                          $keys = explode(",", $word);
                  }
      
          }
      

1 个答案:

答案 0 :(得分:1)

您可以尝试匹配:

^\w+\s+(?:PRIMARY KEY|UNIQUE) INDEX \(([^)]+)\)

对于每一行,然后捕获括号内的$1,并使用explode上的$1