sql - Firebird 添加具有默认值但不同值的列

标签 sql firebird ddl firebird2.5

我正在尝试向 firebird 表添加一列。该列应该有一个默认值 1,但最初对于已经存在的行,该值应该设置为 0。这应该发生在一个事务中。

我试过

ALTER TABLE MYTABLE ADD MYCOLUMN SMALLINT DEFAULT 1 NOT NULL;
UPDATE MYTABLE SET MYCOLUMN = 0; 

但这在一笔交易中是不允许的,因为更新不会看到新列。我也试过:
ALTER TABLE MYTABLE ADD MYCOLUMN SMALLINT DEFAULT 0 NOT NULL;
ALTER TABLE MYTABLE ALTER COLUMN MYCOLUMN SET DEFAULT 1 NOT NULL;

希望该列之后为 0 但它将为 1。

在一笔交易中获得我想要的东西的更多选择?

最佳答案

不幸的是,您不能在一次交易中做到这一点。 Firebird 不允许更新/插入使用在同一事务中创建的对象(在本例中为列),因为 DDL 实际上仅在事务提交时才真正执行/完成,并且出于同样的原因执行两个 alter table同一列的语句将表现为只有一个 alter table语句已发出(因此将应用最后一个默认值)。

您有两个选择:

  • 添加初始默认值为 0 的列,提交,更改新默认值为 1 的列,
  • 添加最终默认值为 1 的列,提交,更新初始值为 0 的列。

  • 实际上还有更多选择,但这只会使问题复杂化(尤其是在 Firebird 3 之前),并且需要更多事务。

    顺便说一句:ALTER TABLE MYTABLE ALTER COLUMN MYCOLUMN SET DEFAULT 1 NOT NULL应该给你一个语法错误,因为在 Firebird 2.5 中改变了 NOT NULL不支持,在 Firebird 3 中它需要 a separate alter table mytable alter column set not null .

    关于sql - Firebird 添加具有默认值但不同值的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38148247/

    相关文章:

    sql - 什么会导致合法的 MySql INSERT INTO 命令失败?

    java - 很好的免费 sqlite gui 工具

    mysql - 为什么这个 SQL 代码不安全?

    database - Firebird 客户端/服务器与 DB2 Express C 相比如何

    PostgreSQL : How to run ALTER queries returned as a result from SQL SELECT statement

    sql - 级联删除查询

    c# - Guid.Tostring() 在我的数据库中给出了与 UUID_TO_CHAR 不同的表示

    php - Zend 框架 Firebird 示例

    mysql - 如果列不存在,则将列添加到 mysql 表中

    mysql - 如何查看使用 DDL 创建的 mySQL 数据库的 EER 模型