是否有可能找出一个火鸟表有一个自动增量列?
Firebird 2.5及更早版本没有自动递增列,这通常是通过使用触发器和序列(又名生成器)来解决的,如本页所示。没有通用的方法来检测这种类型的自动递增列(尽管在特定情况下,您可能能够从触发器和/或序列的命名约定中推断出一些事情)。
Firebird 3.0引入了标识列(GENERATED BY DEFAULT AS IDENTITY
), Firebird 4.0通过添加GENERATED ALWAYS AS IDENTITY
对其进行了扩展。
可以通过系统表RDB$RELATION_FIELDS
的RDB$IDENTITY_TYPE
列来检测这种类型的自增列,其值为:
NULL
- not a identity column0
- identity column,GENERATED ALWAYS
1
- identity column,GENERATED BY DEFAULT
例如,列出所有标识列:
select
RDB$RELATION_NAME,
RDB$FIELD_NAME,
decode(RDB$IDENTITY_TYPE, 0, 'ALWAYS', 1, 'DEFAULT', 'unknown type') as IDENTITY_TYPE
from RDB$RELATION_FIELDS
where RDB$IDENTITY_TYPE is not null
但是,请记住,即使使用Firebird 3.0或更高版本,表仍然有可能使用触发器+序列的传统方式。
下面是一个PHP函数,它检索RDB$TRIGGER_BLR (BLOB)列作为文本,然后解析它以获得列名
function getAutoIncrementColumns($table)
{
$auto_increment_columns = array();
// add your pdo connection here
$stmt = $pdo->query('SELECT cast(RDB$TRIGGER_BLR as blob character set utf8) AS STRVAL FROM RDB$TRIGGERS WHERE RDB$SYSTEM_FLAG = 0 AND RDB$TRIGGER_TYPE=1 AND RDB$RELATION_NAME='YOUR_TABLE_HERE'');
$rows = $stmt->fetchAll(PDO::FETCH_COLUMN);
if ($rows) {
foreach ($rows as $str) {
if (preg_match('`blr_field,(?:s?[0-9]+,s?[0-9]+),s?([^s]+),`', $str, $out)) {
$auto_increment_columns[] = str_replace(array(''', ','), '', $out[1]);
}
}
}
return $auto_increment_columns;
}
希望有一天能帮到别人