如何在Firebird中自动检测具有自动递增数据类型的列?



是否有可能找出一个火鸟表有一个自动增量列?

Firebird 2.5及更早版本没有自动递增列,这通常是通过使用触发器和序列(又名生成器)来解决的,如本页所示。没有通用的方法来检测这种类型的自动递增列(尽管在特定情况下,您可能能够从触发器和/或序列的命名约定中推断出一些事情)。

Firebird 3.0引入了标识列(GENERATED BY DEFAULT AS IDENTITY), Firebird 4.0通过添加GENERATED ALWAYS AS IDENTITY对其进行了扩展。

可以通过系统表RDB$RELATION_FIELDSRDB$IDENTITY_TYPE列来检测这种类型的自增列,其值为:

NULL- not a identity column
0- 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;
}

希望有一天能帮到别人

最新更新