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 连接池中等待吗?