informix 中表的模式

Posted

技术标签:

【中文标题】informix 中表的模式【英文标题】:Schema for a table in informix 【发布时间】:2012-12-18 14:27:51 【问题描述】:

我必须为数据库表设计架构。

它是这样的:

     field1 is TRUE/FALSE
     field2 is TRUE/FALSE
     field3 is TRUE/FALSE
     field4 is TRUE/FALSE
     field5 is char(50)  if field4 is TRUE

有人可以为这种表建议一个最佳架构吗?

我正在使用 Informix 数据库。

【问题讨论】:

哪个版本的 Informix? 【参考方案1】:

Informix 有一个稍微奇怪的 BOOLEAN 类型。您可能更喜欢使用fieldN CHAR(1) NOT NULL CHECK(fieldN IN ('Y', 'N'))(或IN('T', 'F'))。但是 BOOLEAN 在其范围内工作。

CREATE TABLE Anonymous
(
    ID_Column     SERIAL NOT NULL PRIMARY KEY,
    field1        BOOLEAN NOT NULL,
    field2        BOOLEAN NOT NULL,
    field3        BOOLEAN NOT NULL,
    field4        BOOLEAN NOT NULL,
    field5        CHAR(50),
    CHECK((field4 = 't' AND field5 IS NOT NULL) OR (field4 = 'f' AND field5 IS NULL))
);

't''f' 是Informix BOOLEAN 的特性之一;名称 TRUE 和 FALSE 无法识别。

【讨论】:

抱怨:当我运行上面的 SQL 时,我得到了错误:SQL -677: Check constraint cannot contain subqueries or procedures. 这没有多大意义。那里没有子查询;那里也没有明确的过程调用。我不确定,但我假设在约束中处理field4 时必须有一个隐式过程调用。 我认为 OP 的 TRUE/FALSE 数据类型来自 MS-Access。 Informix 的 BOOLEAN 值是否不区分大小写?我更喜欢将 INT 或 SMALLINT 与 CHAR(1) 用于 TRUE/FALSE,因为它消耗的存储空间更少并且可能更快。 语法正确;值得怀疑的是语义解释。将类型从 BOOLEAN 更改为 CHAR(1),约束就可以了。这是 IDS 中的一个奇怪错误(在 Mac OS X 10.7.5 上已验证 11.70.FC6)。 这行得通:CREATE TABLE t(i INTEGER NOT NULL, s CHAR(12) NOT NULL, CHECK((i > 10 AND s IS NOT NULL) OR (i <= 10 AND s IS NULL)) ); 也行:CREATE TABLE Anonymous2(ID_Column SERIAL NOT NULL PRIMARY KEY, field1 CHAR(1) NOT NULL, field2 CHAR(1) NOT NULL, field3 CHAR(1) NOT NULL, field4 CHAR(1) NOT NULL CHECK(field4 IN ('t', 'f')), field5 CHAR(50), CHECK((field4 = 't' AND field5 IS NOT NULL) OR (field4 = 'f' AND field5 IS NULL)) ); 除了类型之外,它们基本上是同构的。我在 CQ(内部错误跟踪系统)中为它创建了一个错误。 因为 BOOLEAN 被 IDS 视为“扩展类型”而不是“内置”类型,并且不能在 CHECK 约束中调用 UDR,但条件需要调用 UDR,并且……可以说,它是一种“有点奇怪”的类型;我可能会坚持使用 'CHAR(1)' 代替。有很多复杂的历史可以追溯到大约 1995 年,当时 Informix 接管了 Illustra 并将 Illustra 集成到 Informix 中以创建 IUS(Informix 通用服务器)。【参考方案2】:

如果 field4 为 FALSE,那么 field5 应该是什么?列的数据类型不能是条件的或动态的!但是,如果您定义 VARCHAR 而不是 CHAR,则大小可以是可变的。如果 field4 为 FALSE,您可以添加一个额外的列。

field1 BOOLEAN,
field2 BOOLEAN,
field3 BOOLEAN,
field4 BOOLEAN,
field5 CHAR(50),  if field4 is TRUE
field6 DATATYPE   if field4 is FALSE

【讨论】:

如果field4 中的值是false,那么field5 应该为NULL。 如果是这种情况,那么就不需要 field6,因为 field5 应该可以保持 CHAR(50) 并且它的值可以设置为 NULL,但是如果 field4 是,OP 没有指定值应该是什么错误。

以上是关于informix 中表的模式的主要内容,如果未能解决你的问题,请参考以下文章

我可以将锁定模式设置为在 Informix - JDBC - tomcat 连接池中等待吗?

informix数据库的日志模式

Informix常用命令

在 4GL Informix 中关闭“Wy-60”?

如何通过 JDBC 显示 Informix sysprocedures.paramtypes 列?

informix 锁表问题