无法在类型化的表 DB2 上定义主键
Posted
技术标签:
【中文标题】无法在类型化的表 DB2 上定义主键【英文标题】:Cannot define Primary key on typed Table DB2 【发布时间】:2014-02-09 16:58:07 【问题描述】:我在 db2 上有一个类型,例如:
create type tipo_vehiculo as(
Descripcion varchar(30)
)MODE DB2SQL;
并且必须使用pk创建一个表,使用oid作为pk不起作用,所以我尝试在表上创建它,但是IBM语法对我不起作用...
create table JORGEMONGE."tipo_vehiculo_t" of tipo_vehiculo(
"id_tipo_vehiculo_t" INT NOT NULL GENERATED ALWAYS AS IDENTITY ( START WITH 1 INCREMENT BY 1 MINVALUE -2147483648 MAXVALUE 2147483647 CACHE 20 ),
ref is oid user generated
);
在“id_tipo_vehiculo_t”之后发现了一个意外的标记“INTEGER”。预期的标记可能包括:“WITH OPTIONS”.. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.17.30
也很受欢迎:
create table JORGEMONGE."tipo_vehiculo_t" of tipo_vehiculo(
"id_tipo_vehiculo_t" INT WITH OPTIONS NOT NULL GENERATED ALWAYS AS IDENTITY ( START WITH 1 INCREMENT BY 1 MINVALUE -2147483648 MAXVALUE 2147483647 CACHE 20 ),
ref is oid user generated
);
但得到:
在“ehiculo integer with”之后发现了一个意外的标记“options”。预期的标记可能包括:“”.. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.17.30
有什么想法可以在该类型表上设置 pk 吗?
【问题讨论】:
【参考方案1】:不知道如何在主键上设置身份规范,但我知道如何设置主键。你需要让它成为你类型的一部分。
create type tipo_vehiculo as( Descripcion varchar(30), id_tipo_vehiculo INTEGER ) MODE DB2SQL;
create table JORGEMONGE."tipo_vehiculo_t" of tipo_vehiculo( ref is oid user generated, "id_tipo_vehiculo_t" WITH OPTIONS NOT NULL, PRIMARY KEY(id_tipo_vehiculo ) );
见:http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000927.html?cp=SSEPGG_9.7.0%2F2-10-6-90
但是,我指出,由于无论如何都会为表自动生成一个 oid 列(这就是 ref is oid user generated
部分的含义),因此最好将其用作主键。
编辑:我已经想出了如何使用 oid 来做到这一点。假设你接受上面的建议并使用对象引用作为主键,它会是这样的
create type JORGEMONGE."tipo_vehiculo" as( Descripcion varchar(30) ) MODE DB2SQL;
create table JORGEMONGE."tipo_vehiculo_t" of JORGEMONGE."tipo_vehiculo"( ref is id_tipo_vehiculo user generated, PRIMARY KEY(id_tipo_vehiculo ) );
create sequence JORGEMONGE."id_tipo_vehiculo_seq" as ref(JORGEMONGE."tipo_vehiculo_t");
create trigger JORGEMONGE.gen_id_tipo_vehiculo no cascade before insert on JORGEMONGE."tipo_vehiculo_t" referencing new as new for each row mode db2sql set new.id_tipo_vehiculo = next value for JORGEMONGE.id_tipo_vehiculo_seq;
文档在这里:http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.admin.structypes.doc/doc/t0006621.html
【讨论】:
以上是关于无法在类型化的表 DB2 上定义主键的主要内容,如果未能解决你的问题,请参考以下文章