我正在尝试构建一个Firebird脚本,以确保存在某个索引并正确创建.经过一段谷歌搜索后,我得到了似乎正确的语法:
SET TERM ^ ;
execute block as begin
IF (EXISTS(SELECT RDB$INDEX_NAME
FROM RDB$INDICES
WHERE RDB$RELATION_NAME='TABLE_NAME'
and RDB$INDEX_NAME = 'INDEX_NAME')) THEN
execute statement 'drop index INDEX_NAME';
end
SET TERM ; ^
CREATE UNIQUE INDEX INDEX_NAME
ON TABLE_NAME
(FIELD1, FIELD2, FIELD3);
Run Code Online (Sandbox Code Playgroud)
这将运行一次,它工作正常.但是如果我第二次尝试运行它,我会得到一个"索引已存在"错误,这表示该execute statement
部分实际上并未运行.
我错过了什么?如何使此脚本正常工作?
使用WITH AUTONOMOUS TRANSACTION子句.以下代码适用于我:
EXECUTE BLOCK
AS BEGIN
IF (EXISTS(SELECT RDB$INDEX_NAME FROM RDB$INDICES
WHERE RDB$RELATION_NAME = '<relation_name>'
AND RDB$INDEX_NAME = '<index_name>')) THEN
BEGIN
EXECUTE STATEMENT 'drop index <index_name>'
with autonomous transaction;
END
EXECUTE STATEMENT 'create index <index_name> on ...'
with autonomous transaction;
END
Run Code Online (Sandbox Code Playgroud)
你有没有犯交易?
默认情况下,大多数关系数据库在事务中运行.直到您commit
或rollback
交易挂起.你需要
drop index foo
commit -- some implementations use 'commit work' others 'commit transaction'
create index foo on bar ( col_1 , ... , col_n )
commit -- some implementations use 'commit work' others 'commit transaction'
Run Code Online (Sandbox Code Playgroud)