sql - 如何制作可重复的索引脚本?

标签 sql firebird

我正在尝试构建一个 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);

这将运行一次,并且运行良好。但是如果我尝试第二次运行它,我会收到一个“索引已经存在”的错误,这表明 execute statement部分实际上并未运行。

我错过了什么?我如何使这个脚本正常工作?

最佳答案

使用 自动交易条款。以下代码对我有用:

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

关于sql - 如何制作可重复的索引脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12117206/

相关文章:

sql - 如何使用 HeidiSQL 在 Firebird 中设置超时?

URL 的 MySQL 数据类型

c# - 使用PHP显示用于C#程序的SQL表

firebird - 保护 firebird 嵌入文件

linux - 如何在 Raspbian 上连接 TA+ 数据库(Firebird)?

插入行而不设置主列

c# - Sparx EA .feap 项目图像保存为空白

mysql - SQL ROW_NUMBER 给出错误

mysql - 如何为我的应用程序设置约束或限制,以便我不会删除当前正在使用的记录?

sql - 在 MS Access 中格式化