Informix 如何更加有效的创建主键和外键

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Informix 如何更加有效的创建主键和外键相关的知识,希望对你有一定的参考价值。

参考技术A 许多人喜欢在
CREATE
TABLE
语句中使用约束键字来创建主键、外键、惟一性和其他约束。他们认为这是一种创建约束的简单且方便的方法。下面是一个例子:
CREATE
TABLE
sub_accounts
(
sub_acc
INTEGER
PRIMARY
KEY,
ref_num
INTEGER
NOT
NULL,
ref_type
INTEGER
NOT
NULL,
sub_descr
CHAR(20),
FOREIGN
KEY
(ref_num,
ref_type)
REFERENCES
accounts
(acc_num,
acc_type));
遗憾的是,对于数据库的性能和管理,这样做并不好。当
Informix
读取以上
CREATE
TABLE
语句时,它将自动创建两个索引,一个用于
sub_acc
上的主键,一个用于
ref_num

ref_type
上的外键。然后,它将自动为每一个索引指派一个系统编号,并将该编号用作索引名,对于开发人员和设计人员而言,这没有任何意义。更糟的是,这些索引是在数据
dbspace
内部创建的,因此会对数据库总体性能产生负面影响,所以
Informix
文档并不建议这样做。此外,在删除该表的主键或外键约束时,将自动删除这些索引;因此,如果需要在查询中使用这些索引,则需要重新创建它们。如果表中有数百万行,那么这可能是一个十分耗时的过程。
因此,在表中创建或添加约束的正确过程如下:
创建不含约束键字的表。
在将使用约束的列上创建索引。
更改表来添加约束。
下面是一个很好的例子:
CREATE
TABLE
item(
Item_num
smallint,
Order_num
integer
,
Stock_num
smallint,
Manu_code
char(3)
,
Quantity
smallint,
Total_price
money(8))IN
data1;CREATE
UNIQUE
INDEX
item_idx1
ON
item
(item_num)
IN
idx1;
本例中,您可以在不同的数据库空间(dbspace)中放置索引和数据,避免与索引一起删除主键约束。

是否可以检查 Informix 表是否具有主键 [重复]

【中文标题】是否可以检查 Informix 表是否具有主键 [重复]【英文标题】:Is it possible to check if an Informix table has a primary key [duplicate] 【发布时间】:2015-10-19 14:50:27 【问题描述】:

是否可以(通过查询)检查 Informix 表的主键是否存在?我必须通过 javax.persistence 的 EntityManager 从 Java 代码中检查这一点。

【问题讨论】:

是的,在 Informix 中确定一个表是否有主键当然是可能的(参见perdomoff 在他的answer 中引用的question。你如何使用javax.persistence EntityManager 是一个单独的问题,需要比我更多的 Java 知识。 【参考方案1】:

Chris311,请参阅下面的链接,其中提出并解决了类似问题:

Query to check if primary key exists on the table in informix

用户首先查找 PK 的索引名称(pk_idx 列) 然后,检查索引列(查找与 PK 约束相同的索引名称)。

【讨论】:

【参考方案2】:

任何数据库都支持检索有关数据库架构本身的信息和/或允许更改它的特殊命令。

例如 MySQL 支持命令SHOW CREATE TABLE(参见here)。 Informix 版本的类似命令称为info。详情请看以下讨论:Informix SQL - List all fields & tables

Java 持久化 API 可以运行当前数据库支持的任何命令,包括管理命令,因此您也可以运行info 命令。我建议您从使用针对您的数据库运行命令的任何 UI 或命令行工具开始使用此命令。一旦您的命令有效,请尝试从 java 运行它。

【讨论】:

请注意,只有 DB-Access 程序可以理解 Informix INFO 语句。它将 INFO 语句转换为针对系统目录的一个或多个查询。

以上是关于Informix 如何更加有效的创建主键和外键的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ActiveRecord 访问隐藏列(在 Informix 中)

是否可以检查 Informix 表是否具有主键 [重复]

informix数据库锁表怎么处理

informix数据库错误码-268与-239有啥不同

怎么向informix数据库表中一次插入多条记录

为啥informix数据库锁表重启后就坏了