Откройте для себя первичные / уникальные ключи в Sybase ASE: регулярные выражения и PHP - PullRequest
1 голос
/ 27 декабря 2011

Я получаю эту информацию от 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

Я хочу извлечь:

  1. id от ПЕРВИЧНОГО,
  2. unik от UNIQUE,
  3. comp_unik1 и comp_unik2 из UNIQUE

следующим образом:

  1. $ keys [] = id
  2. $ уникальных ['iyas_grand_2317208972'] [] = unik
  3. $ уникально ['iyas_grand_2317208973'] [] = comp_unik1
  4. $ уникальных ['iyas_grand_2317208973'] [] = comp_unik1

обратите внимание, что иногда ПЕРВИЧНЫМ ключом может быть ИНДЕКС ПЕРВИЧНОГО КЛЮЧА (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 Ответ

1 голос
/ 27 декабря 2011

Вы можете попробовать и сопоставить:

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

для каждой строки, затем захватить $1, что находится между скобками, и использовать explode, как вы уже делаете на $1.

...