SHOW KEYS FROM 翻訳
2006年3月19日
kosugiatkipsさんに教わった命令で、MySQL の『SHOW KEYS FROM』に相当する部分が見えてきた。キー(インデックス)の作成は、SQLiteでは、
のようにすればよい。この書式をテーブルから読み出すには、
で良いらしい。実行結果の例は、次の通り。
実行結果
(追記:060404)
テーブル作成の際のPRIMARY KEY(xxx,xxx) にも対処した。あとは、auto_increment の際に、PRIMARY KEY 指定するようにする必要有り。(ver 0.57 で解決)
CREATE INDEX 'ibody' ON 'nucleus_item' ('ibody','ititle','imore')");のようにすればよい。この書式をテーブルから読み出すには、
$res=sqlite_mysql_query("SELECT sql,name FROM sqlite_master WHERE type = 'index' and tbl_name = 'nucleus_item' ORDER BY type DESC");
while ($a=sqlite_mysql_fetch_assoc($res)) foreach($a as $key=>$value) echo "$key=>$value</br>\n";で良いらしい。実行結果の例は、次の通り。
sql=>CREATE INDEX 'itime' ON 'nucleus_item' ('itime')
name=>'itime'
sql=>CREATE UNIQUE INDEX 'inumber' ON 'nucleus_item' ('inumber')
name=>'inumber'
sql=>CREATE INDEX 'ibody' ON 'nucleus_item' ('ibody','ititle','imore')
name=>'ibody'
sql=>
name=>(nucleus_item autoindex 1)| (string) | Table | nucleus_item | nucleus_item | nucleus_item | nucleus_item | nucleus_item | nucleus_item |
| (string) | Non_unique | 0 | 0 | 1 | 1 | 1 | 1 |
| (string) | Key_name | PRIMARY | inumber | itime | ibody | ibody | ibody |
| (string) | Seq_in_index | 1 | 1 | 1 | 1 | 2 | 3 |
| (string) | Column_name | inumber | inumber | itime | ibody | ititle | imore |
| (string) | Collation | A | A | A | A | A | A |
| (string) | Cardinality | 14 | 14 | 14 | 14 | 14 | 14 |
| (NULL) | Sub_part | ||||||
| (NULL) | Packed | ||||||
| (string) | Null | YES | YES | ||||
| (string) | Index_type | BTREE | BTREE | BTREE | FULLTEXT | FULLTEXT | FULLTEXT |
| (string) | Comment |
| カラム | 意味 |
Table | テーブル名。 |
Non_unique | インデックスに重複が許されない場合は 0、許される場合には 1。 |
Key_name | インデックス名。 |
Seq_in_index | インデックスのカラムシーケンス番号。1 から始まる。 |
Column_name | カラム名。 |
Collation | インデックスでのカラムのソート方法。 MySQL ではこれは ‘A’(昇順)または NULL(ソートしない)になる。 |
Cardinality | インデックス内のユニークな値の数。 これは、isamchk -a の実行によって更新される。 |
Sub_part | カラムが部分的にインデックスになっている場合は、インデックスになっている文字数。 キー全体がインデックスになっている場合は NULL。 |
Null | カラムに NULL を含めることができれば 'YES'。 |
Index_type | 使用されるインデックス方式。 |
Comment | さまざまなコメント。現在のところ、MySQL 4.0.2 より前のバージョンでは、インデックスが FULLTEXT か否かを表示。 |
$tname='nucleus_item';
//sqlite_mysql_query("CREATE UNIQUE INDEX 'inumber' ON '$tname' ('inumber')");
//sqlite_mysql_query("CREATE INDEX 'itime' ON '$tname' ('itime')");
//sqlite_mysql_query("CREATE INDEX 'ibody' ON '$tname' ('ibody','ititle','imore')");
$res=sqlite_mysql_query("SELECT * FROM sqlite_master WHERE tbl_name = '$tname' ORDER BY type DESC");
$tablestruct=sqlite_mysql_fetch_assoc($res);
//foreach($tablestruct as $key=>$value) echo "$key=>$value</br>\n";
$tablesql=$tablestruct['sql'];
$notnull=array();
foreach(sqlite_splitByComma(substr($tablesql,strpos($tablesql,'(')+1)) as $value) {
$name=str_replace("'",'',substr($value,0,strpos($value,' ')));
echo "$name:$value</br>\n";
if (strpos(strtoupper($value),'NOT NULL')!==false) $notnull[$name]='';
else $notnull[$name]='YES';
}
echo "";
if (preg_match('/[^a-zA-Z_\']([\S]+)[^a-zA-Z_\']+INTEGER NOT NULL PRIMARY KEY/i',$tablesql,$matches)) {
$pkey=$matches[1];
$pkeynull='';
} else if (preg_match('/[^a-zA-Z_\']([\S]+)[^a-zA-Z_\']+INTEGER PRIMARY KEY/i',$tablesql,$matches)) {
$pkey=$matches[1];
$pkeynull='YES';
} else $pkey=null;
$pkey=str_replace("'",'',$pkey);
echo "$pkey";
echo "";
if (function_exists('microtime')) $tmpname='t'.str_replace('.','',str_replace(' ','',microtime()));
else $tmpname = 't'.rand(0,999999).time();//'inumber' INTEGER NOT NULL PRIMARY KEY,
sqlite_mysql_query("CREATE TEMPORARY TABLE $tmpname ('Table', 'Non_unique', 'Key_name', 'Seq_in_index',".
" 'Column_name', 'Collation', 'Cardinalit', 'Sub_part', 'Packed', 'Null', 'Index_type', 'Comment')");
$res=sqlite_mysql_query("SELECT sql,name FROM sqlite_master WHERE type = 'index' and tbl_name = '$tname' ORDER BY type DESC");
while ($a=sqlite_mysql_fetch_assoc($res)) {
if (!($sql=$a['sql'])) {
if ($pkey && strpos(strtolower($a['name']),'autoindex')) {
$cardinalit=sqlite_mysql_num_rows(sqlite_mysql_query("SELECT $pkey FROM '$tname'"));
sqlite_mysql_query("INSERT INTO $tmpname ('Table', 'Non_unique', 'Key_name', 'Seq_in_index',".
" 'Column_name', 'Collation', 'Cardinalit', 'Sub_part', 'Packed', 'Null', 'Index_type', 'Comment')".
" VALUES ('$tname', '0', 'PRIMARY', '1',".
" '$pkey', 'A', '$cardinalit', null, null, '$pkeynull', 'BTREE', '')");
}
} else {
if (($name=str_replace("'",'',$a['name'])) && preg_match('/\(([\s\S]+)\)/',$sql,$matches)) {
foreach(explode(',',$matches[1]) as $key=>$value) {
$columnname=str_replace("'",'',$value);
if (strpos(strtoupper($sql),'CREATE UNIQUE ')===0) $nonunique='0';
else $nonunique='1';
$cardinalit=sqlite_mysql_num_rows(sqlite_mysql_query("SELECT $columnname FROM '$tname'"));
sqlite_mysql_query("INSERT INTO $tmpname ('Table', 'Non_unique', 'Key_name', 'Seq_in_index',".
" 'Column_name', 'Collation', 'Cardinalit', 'Sub_part', 'Packed', 'Null', 'Index_type', 'Comment')".
" VALUES ('$tname', '$nonunique', '$name', '".(string)($key+1)."',".
" '$columnname', 'A', '$cardinalit', null, null, '$notnull[$columnname]', 'BTREE', '')");
}
}
}
}
echo "";
$res=sqlite_mysql_query("SELECT * FROM $tmpname");
while ($a=sqlite_mysql_fetch_assoc($res)) {
foreach($a as $key=>$value) echo "$key=>$value</br>\n";
echo "</br>\n";
}実行結果
inumber:'inumber' INTEGER NOT NULL PRIMARY KEY
ititle:'ititle' varchar(160) default NULL
ibody:'ibody' text NOT NULL
imore:'imore' text
iblog:'iblog' int(11) NOT NULL default ''
iauthor:'iauthor' int(11) NOT NULL default ''
itime:'itime' datetime NOT NULL default '0000-00-00 00:00:00'
iclosed:'iclosed' tinyint(2) NOT NULL default ''
idraft:'idraft' tinyint(2) NOT NULL default ''
ikarmapos:'ikarmapos' int(11) NOT NULL default ''
icat:'icat' int(11) default NULL
ikarmaneg:'ikarmaneg' int(11) NOT NULL default ''
UNIQUE:UNIQUE ('inumber') )
inumber
Table=>nucleus_item
Non_unique=>1
Key_name=>ibody
Seq_in_index=>1
Column_name=>ibody
Collation=>A
Cardinalit=>3
Sub_part=>
Packed=>
Null=>
Index_type=>BTREE
Comment=>
Table=>nucleus_item
Non_unique=>1
Key_name=>ibody
Seq_in_index=>2
Column_name=>ititle
Collation=>A
Cardinalit=>3
Sub_part=>
Packed=>
Null=>YES
Index_type=>BTREE
Comment=>
Table=>nucleus_item
Non_unique=>1
Key_name=>ibody
Seq_in_index=>3
Column_name=>imore
Collation=>A
Cardinalit=>3
Sub_part=>
Packed=>
Null=>YES
Index_type=>BTREE
Comment=>
Table=>nucleus_item
Non_unique=>1
Key_name=>itime
Seq_in_index=>1
Column_name=>itime
Collation=>A
Cardinalit=>3
Sub_part=>
Packed=>
Null=>
Index_type=>BTREE
Comment=>
Table=>nucleus_item
Non_unique=>
Key_name=>inumber
Seq_in_index=>1
Column_name=>inumber
Collation=>A
Cardinalit=>3
Sub_part=>
Packed=>
Null=>
Index_type=>BTREE
Comment=>
Table=>nucleus_item
Non_unique=>
Key_name=>PRIMARY
Seq_in_index=>1
Column_name=>inumber
Collation=>A
Cardinalit=>3
Sub_part=>
Packed=>
Null=>
Index_type=>BTREE
Comment=>(追記:060404)
テーブル作成の際のPRIMARY KEY(xxx,xxx) にも対処した。あとは、auto_increment の際に、PRIMARY KEY 指定するようにする必要有り。(ver 0.57 で解決)